[Python-es] búsqueda automática de clases en un paquete

Jose Caballero jcaballero.hep en gmail.com
Mie Oct 13 01:44:38 CEST 2010


Hola,

creo que el "subject" no es demasiado descriptivo, pero la verdad es que no
sé muy bien como poner uno más adecuado.
Intentaré explicar el problema, a ver si alguien puede darme una pista.

Tengo una estructura de directorio y ficheros como la siguiente:

my_stuffs/
    |
    | -- my_program.py
    |
    | -- my_libs/
                |
                | --  __init__.py
                |
                | -- dispatcher.py
                |
                | -- mod1.py
                |
                | -- mod2.py


(1)  __init__.py está vacío.
(2)  mod1.py tiene clases. Por ejemplo, C11, C12, C13...
(3)  mod2.py tiene clases. Por ejemplo, C21, C22, C23...
No hay riesgo de dos clases con el mismo nombre, una en cada módulo.
(4) En my_program.py necesito crear un objeto de cualquiera de las clases
contenidas en mod1 o mod2. Durante la ejecución del programa el nombre de la
clase es conocido, como cadena de caracteres. A partir del nombre necesito
crear un objeto de esa clase.
Para esa creación del objecto correspondiente he implementado dispatcher.py
Ahora mismo tiene un aspecto similar a éste:

----------------------------------------------------------------------------
import mod1
import mod2

def getobject(name):
        if hasattr(mod1, name):
                return getattr(mod1, name)()
        if hasattr(mod2, name):
                return getattr(mod2, name)()
----------------------------------------------------------------------------

De esta forma, en my_program.py me basta con hacer algo como:

----------------------------------------------------------------------------
from my_libs import dispatcher

[...]
classname = 'C21'
my_object = dispatcher.getobject(classname)
[...]
----------------------------------------------------------------------------

Esto funciona.
Pero no me gusta, porque en el futuro varias personas irán añadiendo módulos
dentro de my_libs y eso requiere, tal y como he escrito el código hasta
ahora, editar dispatcher.py para añadir un nuevo import y un nuevo par de
líneas como:

----------------------------------------------------------------------------
import modN

        if hasattr(modN, name):
                return getattr(modN, name)()
----------------------------------------------------------------------------

¿No hay forma de hacerlo más automático?
Lo ideal sería hacer un loop a los módulos que existan en el directorio
my_libs, de forma que no sea necesario escribir a mano esas dos líneas, uno
por módulo.


Cualquier idea será más que bienvenida.
Muchas gracias por adelantado.


Saludos cordiales,
Jose
------------ próxima parte ------------
Se ha borrado un adjunto en formato HTML...
URL: <http://mail.python.org/pipermail/python-es/attachments/20101012/e259409b/attachment.html>


Más información sobre la lista de distribución Python-es