El día 23 de agosto de 2013 12:02, Chema Cortes <pych...@gmail.com> escribió: > El día 22 de agosto de 2013 02:59, Juan BC <jbc.deve...@gmail.com> escribió: >> Estoy haciendo un pequeño script que recibe otro script por parametro >> (osea un plugin) y lo que necesito es ordenar las clases dentro de el >> plugin en el orden que fueron declaradas: >> >> en un ejemplo trivial seria algo asi: >> >> # plugin.py >> >> class B(object): pass >> class A(object): pass >> >> # manager.py >> >> import plugin >> >> classes = [k, v for k,v in vars(plugin).items()] >> classes.sort(<CODIGO PARA ORDENAR B antes que A>) > > No es buena idea ésto que quieres hacer. Por ejemplo, ¿dónde dirías > que se "declaran" las clases si hago ésto?: > > from plugin import * > > ¿Y si me da por hacer cosas como estas? > > class A: pass > > B = A > > class A: pass > > Hay dos clases, pero en verdad he redeclarado 'A'. > > Por lo que parece, estás creando una especie de API para creación de > plugins y te gustaría obtener el orden de los plugins tal y como son > declarados. Una solución sería usando metaclases tal como te ha > sugerido Olemis Lang. Pero las metaclases son algo complejas de > manejar y es posible evitar su uso en muchos casos desde que existen > los decoradores de clase. > > Por ejemplo, puedes hacer lo siguiente: > > class Plugin(object): > > def __init__(self): > self.plugins = {} > > def register(self, cls): > > if cls.__module__ not in self.plugins: > self.plugins[cls.__module__] = [] > > self.plugins[cls.__module__].append(cls.__name__)
Un pequeño fallo: para que funcione bien, el decorador debe devolver la clase def register(self, cls): if cls.__module__ not in self.plugins: self.plugins[cls.__module__] = [] self.plugins[cls.__module__].append(cls.__name__) return cls > > plugin=Plugin() > > Y pedir a tus usuarios que "registren" sus plugins: > > @plugin.register > class A(object): > pass > > @plugin.register > class B(object): > pass > > Si quieres más control, puedes crear decoradores con argumentos, por > ejemplo para pasar el nombre completo del plugin o el autor. > > > -- > Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": > http://ch3m4.org/blog > Buscador Python Hispano: http://ch3m4.org/python-es -- Hyperreals *R "Quarks, bits y otras criaturas infinitesimales": http://ch3m4.org/blog Buscador Python Hispano: http://ch3m4.org/python-es _______________________________________________ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/