[Python-es] determinar cual clase ha sido declarada primero
Olemis Lang
olemis en gmail.com
Jue Ago 22 05:48:32 CEST 2013
On 8/21/13, Juan BC <jbc.develop en gmail.com> wrote:
> 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>)
>
Ejemplos rápidos con Python 2.x
Sugerencia #1 : Solución genérica
{{{#!py
>>> class TimestampedType(type):
... def __init__(self, *args, **kwargs):
... super(TimestampedType, self).__init__(*args, **kwargs)
... self.__timestamp__ = datetime.now()
...
>>> from datetime import datetime
>>> class A:
... __metaclass__ = TimestampedType
...
>>> class B:
... __metaclass__ = TimestampedType
...
>>> class C:
... __metaclass__ = TimestampedType
...
>>> classes = [B, A, C]
>>> sorted(classes, key=lambda cls: cls.__timestamp__)
[<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>]
}}}
Sugerencia #2 : Meta-cache (similar a ComponentMeta.cache de Trac + Bloodhound)
{{{#!py
>>> class PluginMeta(type):
... __cache__ = []
... def __init__(self, *args, **kwargs):
... super(PluginMeta, self).__init__(*args, **kwargs)
... self.__cache__.append(self)
...
>>> class A:
... __metaclass__ = PluginMeta
...
>>> class B:
... __metaclass__ = PluginMeta
...
>>> class C:
... __metaclass__ = PluginMeta
...
>>> PluginMeta.__cache__
[<class '__main__.A'>, <class '__main__.B'>, <class '__main__.C'>]
}}}
En ambos casos se puede prescindir de la meta-clase explícita
utilizando herencia
--
Regards,
Olemis - @olemislc
Apache™ Bloodhound contributor
http://issues.apache.org/bloodhound
http://blood-hound.net
Blog ES: http://simelo-es.blogspot.com/
Blog EN: http://simelo-en.blogspot.com/
Featured article:
Más información sobre la lista de distribución Python-es