[Python-es] determinar cual clase ha sido declarada primero

Chema Cortes pych3m4 en gmail.com
Vie Ago 23 12:02:00 CEST 2013


El día 22 de agosto de 2013 02:59, Juan BC <jbc.develop en 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__)

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


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