Re: [Python-es] búsqueda automática de clases en u n paquete

2010-10-27 Por tema Jose Caballero


 
  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 Por tema Olemis Lang (Simelix)
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

2010-10-13 Por tema Juan Ignacio
¿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

2010-10-13 Por tema Juan Ignacio

 ¿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

2010-10-12 Por tema Jose Caballero
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/