Python, funciones o libreria ?

Iniciado por EvilGoblin, 10 Julio 2010, 01:00 AM

0 Miembros y 1 Visitante están viendo este tema.

EvilGoblin

Una simple duda que tengo a la hora de programar

que recomiendan, usar el interprete de Python y crear funciones usandolas como librerias

o crear un script con bucles donde se utilizen las funciones que tiene?


Ejemplo de lo que digo:

Estoy haciendo un "test" de sql... y hago funciones que me sirven para quitar el trabajo monotono
(lo hago por simple curiosidad, nada raro)

entonces tengo sql_union.py, sql_blind.py, sql_blind_columnas.py ....

y para aprender mas sobre python, me estoy disponiendo a juntar todo eso dentro de una base.

mi intencion es poder pasarle los datos al script y q haga todo el "trabajo duro"

lo de la logica lo tengo ya todo armado (pseudo-codigo)..

pero cuando me dispose a programar me quedo estancado en como programarlo...

crear al estilo C (poor console) cuando pones las opciones y les das los datos

1) agregar variable
2) agregar url
3) agregar semilla
blah blah ...

o crearlo dentro del interprete (al estilo metasploit)

>> import sql_base
>> sql_base.url("http://192.168.1.3/index.php?id=")
>>sql_base.ejecutar()

blah blah blah....


¿como es conveniente en un codigo a medida?

como lo harian? (no me digan C, Perl, java, xDDDD)
Experimental Serial Lain [Linux User]

Novlucker

La pregunta entonces es, módulos o funciones :P
Y la respuesta es ... depende :rolleyes:

La ventaja de utilizar módulos es lo reusable y extensible de estos. Los módulos puedes reusarlos en múltiples scripts y extender su utilidad agregandole nuevas funciones, además de que al tener todo separado tienes un código mucho más ordenado.
La desventaja es que en el caso de tener muchos modulos el revisar un script te puede llevar a saltar continuamente de un modulo a otro, lo cual puede hacerlo menos entendible, además de que para pequeñas funciones no vale la pena.

Por lo general es más común simplemente utilizar funciones, y dejar la creación de modulos para "librerías" de funciones orientadas a utilidades relacionadas, como lo son las que trae incorporadas python, donde cada modulo apunta a una determinada función.

De cualquier manera, siempre va a gusto del programador :P

Saludos
Contribuye con la limpieza del foro, reporta los "casos perdidos" a un MOD XD

"Hay dos cosas infinitas: el Universo y la estupidez  humana. Y de la primera no estoy muy seguro."
Albert Einstein

xーいぱ

Por mi, recomendaria crear un modulo python, y utilizar un orm para la interaccion con la base de datos

Ejemplo creando el modulo 'xip.mod':

x-ip@darkstar:~$ mkdir tutorial
x-ip@darkstar:~$ cd tutorial/
x-ip@darkstar:~/tutorial$ mkdir xip.mod
x-ip@darkstar:~/tutorial$ touch xip.mod/setup.py
x-ip@darkstar:~/tutorial$ mkdir -p xip.mod/xip/mod
x-ip@darkstar:~/tutorial$ touch xip.mod/xip/__init__.py
x-ip@darkstar:~/tutorial$ touch xip.mod/xip/mod/__init__.py

Luego seteo el setup.py:


from setuptools import setup, find_packages
import sys, os

version = '0.1'

setup(name='xip.mod',
      version=version,
      description="modulo basico de ejemplo",
      long_description="""\
      xip.mod""",
      classifiers=[], # Get strings from http://pypi.python.org/pypi?%3Aaction=list_classifiers
      keywords='',
      author='lain aka x-ip',
      author_email='',
      url='',
      license='',
      packages=find_packages(exclude=['ez_setup', 'examples', 'tests']),
      include_package_data=True,
      zip_safe=False,
      install_requires=[
          # -*- Extra requirements: -*-
      ],
      entry_points="""
      # -*- Entry points: -*-
      """,
      )


podes comprobar de que tu modulo se puede importar, usando ipython de
la siguiente forma:



In [1]: import sys

In [2]: pwd
Out[2]: '/home/x-ip/tutorial'

In [3]: ls
xip.mod/

In [4]: cd xip.mod/
/home/x-ip/tutorial/xip.mod

In [5]: __import__('xip.mod')
Out[5]: <module 'xip' from 'xip/__init__.pyc'>

In [6]: 'xip.mod' in sys.modules
Out[6]: True



Luego falta escribir una clase para agrupar las funciones relacionadas con la DB, como
recomende usar un orm (object relation mapper), mi preferido es sqlalchemy. Creo un
archivo 'database.py' dentro de mi modulo:


x-ip@darkstar:~/tutorial$ touch xip.mod/xip/mod/database.py


Cual su codigo podria ser por ejemplo:


from sqlalchemy import create_engine
from sqlalchemy import MetaData
from sqlalchemy import orm
from sqlalchemy.orm import sessionmaker


class Database(object):
    '''DatabaseConnection se encarga de gestionar la conexion
    contra la base de datos, utilizando sqlalchemy como orm.
    '''

    def get_engine(self, **kws):
        '''PARAMS **kws: Diccionario que setea los datos de conexión a la DB.
        El metodo retorna un objeto de tipo Engine
        '''
        engine = ('%s://%s:%s@%s/%s' % (kws.get('engine'),
                                        kws.get('user'),
                                        kws.get('passwd'),
                                        kws.get('host'),
                                        kws.get('dbname'))
                                        )

        return create_engine(engine)

    def bind_session(self, engine):
        '''
        PARAMS engine. Es un objeto de tipo Engine.
        Retorna un obj. de tipo Session que luego debe ser instanciado
        localmente.
        Como dice en:
        http://www.sqlalchemy.org/docs/session.html#what-does-the-session-do
        You typically invoke Session() when you first need to talk to your
        database, and want to save some objects or load some existing ones.
        Then, you work with it, save your changes, and then dispose of it....or
        at the very least close() it.
        '''
        return sessionmaker(bind=engine)


Luego, podes probar que tu database.py se puede importar nuevamente utilizando
ipython asi:


In [1]: __import__('xip.mod')
Out[1]: <module 'xip' from 'xip/__init__.pyc'>

In [2]: from xip.mod import database
---------------------------------------------------------------------------
ImportError                               Traceback (most recent call last)

/home/x-ip/tutorial/xip.mod/<ipython console> in <module>()

/home/x-ip/tutorial/xip.mod/xip/mod/database.py in <module>()
      2 from sqlalchemy import MetaData
      3 from sqlalchemy import orm
      4 from sqlalchemy.orm import sessionmaker
      5
      6

ImportError: No module named sqlalchemy


Me tira error por no tener instalado sqlalchemy, pues lo instalamos :)

x-ip@darkstar:~/tutorial/xip.mod$ easy_install sqlalchemy
/usr/lib/python2.6/site-packages/Pyrex/Compiler/Errors.py:17: DeprecationWarning: BaseException.message has been deprecated as of Python 2.6
  self.message = message
Searching for sqlalchemy
Reading http://pypi.python.org/simple/sqlalchemy/
Reading http://www.sqlalchemy.org
Best match: SQLAlchemy 0.6.2
.....


Vuelvo a intentar ...


In [1]: pwd
Out[1]: '/home/x-ip/tutorial/xip.mod'

In [2]: __import__('xip.mod')
Out[2]: <module 'xip' from 'xip/__init__.pyc'>

In [3]: from xip.mod import database


Y ahora si funciona :). Luego para reutilizar tu modulo python, es cuestion de
empaquetarlo en un 'egg'.


(plone4)x-ip@darkstar:~/tutorial/xip.mod$ python setup.py bdist_egg
/usr/lib/python2.6/site-packages/Pyrex/Compiler/Errors.py:17: DeprecationWarning: BaseException.message has been deprecated as of Python 2.6
  self.message = message
running bdist_egg
running egg_info
creating xip.mod.egg-info
....


Tu codigo empaquetado se va a encontrar en el directorio 'dist', te muestro mi shell asi
se entiende:


(plone4)x-ip@darkstar:~/tutorial/xip.mod$ ls dist/
xip.mod-0.1-py2.6.egg


Este paquete xip.mod ahora lo podes pasar a todos tus amigos o vos instalarlo de manera
sencilla en donde lo precises, haciendo:


x-ip@darkstar:~/tutorial/xip.mod/dist$ easy_install xip.mod-0.1-py2.6.egg
/usr/lib/python2.6/site-packages/Pyrex/Compiler/Errors.py:17: DeprecationWarning: BaseException.message has been deprecated as of Python 2.6
  self.message = message
Processing xip.mod-0.1-py2.6.egg
creating /home/x-ip/envs/plone4/lib/python2.6/site-packages/xip.mod-0.1-py2.6.egg
Extracting xip.mod-0.1-py2.6.egg to /home/x-ip/envs/plone4/lib/python2.6/site-packages
Adding xip.mod 0.1 to easy-install.pth file

Installed /home/x-ip/envs/plone4/lib/python2.6/site-packages/xip.mod-0.1-py2.6.egg
Processing dependencies for xip.mod==0.1
Finished processing dependencies for xip.mod==0.1


Al haberlo instalado, ya no es necesario que hagas __import__('...'), si abris tu interprete
de python o ipython veras:


(plone4)x-ip@darkstar:~/tutorial/xip.mod/dist$ ipytho
-bash: ipytho: command not found
(plone4)x-ip@darkstar:~/tutorial/xip.mod/dist$ ipython
Python 2.6.2 (r262:71600, Jun  9 2009, 17:15:39)
Type "copyright", "credits" or "license" for more information.

IPython 0.10 -- An enhanced Interactive Python.
?         -> Introduction and overview of IPython's features.
%quickref -> Quick reference.
help      -> Python's own help system.
object?   -> Details about 'object'. ?object also works, ?? prints more.

In [1]: from xip.mod import database

In [2]:


Saludos :)



I've just abandoned the flesh