On 8/21/13, Juan BC <jbc.deve...@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: _______________________________________________ Python-es mailing list Python-es@python.org http://mail.python.org/mailman/listinfo/python-es FAQ: http://python-es-faq.wikidot.com/