Re: [Python-es] búsqueda automática de clases en u n paquete
Respecto a la clase Base, quiero ver si puedo implementar un raise NotImplementedError Lo he intentado pero no me ha funcionado. Si llamo a un método no implementado en una de las clases heredadas me lanza una excepción AttributeError en lugar de NotImplementedError. {{{ #!python class Base: def oh_mary_mary(self): raise NotImplementedError('... you should be out of your mind ...') class SubClass: rEvery little thing she does is magic ... # PUM !!! SubClass().oh_mary_mary() }}} Como digo, así sin más no parece funcionar. Funciona perfectamente si SubClass está heredada de Base. En ese caso no hay problema. Pero en el código propuesto con metaclases SubClass no hereda de Base, y por tanto el raise NotImplementedError no parece afectarle a SubClass. Supongo que todo es cuestión de dale una vuelta de tuerca más. ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] búsqueda automática de clases en u n paquete
2010/10/27 Jose Caballero jcaballero@gmail.com: ... pruebas , pruebas , no te hace falta equipaje ... y más pruebas ... ;o) -- Por supuesto que sí. No vas a encontrar en esta lista a nadie a quien le desagraden más que a mí las personas que por defecto preguntan sin buscar antes en google o probar por su propia cuenta. Pero esta vez me he visto casi obligado a saltarme mi propio criterio y preguntar sin parar. [...] Este es (probablemente) un caso de mal-interpretación (doblemente salvable, contando este mismo mensaje de mi parte). Dije eso más bien porque todos los consejos que estoy dando son terriblemente imprecisos (puesto a que estoy muy ocupado) y puede que me equivoque y entonces viene la parte del «prueba, prueba» con meneito y música de fondo . Siga preguntando , que todo está bien . Además , la suscripción es gratis , y nadie está obligado a responder ... qué guay !!! Ojalá pudiera decir lo mismo de mi suegra ... (que conste que no tengo , así que ahora puedo aprovechar y echarle un poco de culpas ) :D -- Regards, Olemis. Blog ES: http://simelo-es.blogspot.com/ Blog EN: http://simelo-en.blogspot.com/ Featured article: ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] búsqueda automática de clases en u n paquete
¿Puedes hacer que todas esas clases deriven de una sola? De esa forma podrías hacer que en la clase base se mantuviera un registro de todas las clases derivadas, usando un diccionario,p.e. que mapeara nombre de clase- clase, o nombre de clase - (modulo, clase), o algo similar. 2010/10/13 Rolando Espinoza La Fuente dark...@gmail.com 2010/10/12 Jose Caballero jcaballero@gmail.com: [...] 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. Puedes reusar el código de `walk_modules` de [1]. Y tener algo como: all_modules = walk_modules(my_libs) def getobject(name): for mod in all_modules: if hasattr(mod, name): return getattr(mod, name) Otra alternativa sería utilizar os.listdir() sobre my_libs, cargar los .py con __import__(). Saludos [1] http://hg.scrapy.org/scrapy/file/a6275154f238/scrapy/utils/misc.py#l48 Rolando Espinoza La fuente www.insophia.com ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/ -- Juan Ignacio Rodríguez de León Movil: 605 890514 E-Mail: euriba...@gmail.com http://www.tenerife-lanparty.com/ http://elornitorrincoenmascarado.blogspot.com/ http://descon2.com/ ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
Re: [Python-es] búsqueda automática de clases en u n paquete
¿tendría que mantener a mano ese diccionario o hay forma de hacer que se cree automáticamente? La idea es que se cree y gestione automaticamente, claro. He estado mirando las Metaclases (que es un concepto donde estoy bastante perdido, pero sigo luchando) y se podría hacer algo así:: -[ Cortar por aqui ]--- class Base(type): Catalogo = {} def __new__(cls, name, bases, dct): new_class = type.__new__(cls, name, bases, dct) Base.Catalogo[name] = new_class return new_class def instance_object_of_class(class_name, *args): return Base.Catalogo[class_name](*args) class A1(): __metaclass__ = Base def __str__(self): return 'Soy de la clase A1' class A2(): __metaclass__ = Base def __str__(self): return 'Soy de la clase A2' class B1(): __metaclass__ = Base def __str__(self): return 'Soy de la clase B1' class B2(): __metaclass__ = Base def __init__(self, value): self.value = value def __str__(self): return 'Soy de la clase B2, value vale %s' % self.value -[ Cortar por aqui ]--- Por ejemplo: a1 = instance_object_of_class('A1') print a1 Soy de la clase A1 a2 = instance_object_of_class('A2') print a2 Soy de la clase A2 b1 = instance_object_of_class('B1') print b1 Soy de la clase B1 b2 = instance_object_of_class('B2', 23) print b2 Soy de la clase B2, value vale 23 Lo unico que habria que hacer es incluir la referencia a la metaclase Base con la variable mágica __metaclass__ en la declaración de cada clase. Habría que codificar también un mensaje de error por si se intentar definir dos clases con el mismo nombre, ahora mismo la mas nueva machacaría a la mas antigua. ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/
[Python-es] búsqueda automática de clases en u n paquete
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 ___ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/