[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