[pyar] Llamadas dinamicas resueltas en tiempo de ejecucion
Leonardo M. Rocha
leo.m.rocha en gmail.com
Jue Feb 17 15:23:32 ART 2011
2011/2/17 Marcos Dione <mdione en grulic.org.ar>:
> On Thu, Feb 17, 2011 at 04:28:14PM +0100, Leonardo M. Rocha wrote:
>> La cuestion es que he encontrado algunas maneras de obtener de manera
>> dinamica las cosas que hay dentro de un objeto y decidir cual
>> utilizar.
>>
>> Aca algunas:
>>
>> Mediante el modulo inspect:
>> import inspect:
>> ...
>> #para un plugin determinado obtengo la lista de elementos y las filtro
>> de acuerdo a una lista de metodos que se utilizan
>> processMethod = [i for i in inspect.getmembers(plugin) if i[0] in
>> processMethodCheck]
>>
>> Lo anterior solo parece funcionar lindo para obtener los metodos de un objeto
>
> en realidad getmembers devuelve miembors del objecto. pueden ser métodos,
> atributos, etc. el if i-0= es medio mágico, sobre todo si no nos decís qué es
> processMethodCheck.
My bad, olvide, es una lista de str
i[0] es porque getmembers devuelve tuplas (duplas en realidad) y el
primer argumento es el nombre en str
>
>> Como Python guarda las "cosas" que tiene un objeto dentro de un
>> diccionario que lo representa de alguna manera, se me ocurrio
>> accederlo, llevando a esto:
>> Mediante la obtencion e inspeccion del diccionario del objeto (esto
>> solo para los elementos en un objeto) (aqui ejemplo)
>>
>> In [91]: class C:
>> ....: def __init__(self):
>> ....: self.a = 1
>> ....: self.b = 2
>> ....: self.d = {'c':3, 'd':4}
>> ....: e = 1982
>> ....: def gete(self, element_name, element_type='d'):
>> ....: obj = None
>> ....: print "1"
>> ....: try:
>> ....: print "2"
>> ....: var = self.__dict__[element_type]# getting the
>> element I want from the dictionary
>
> var= getattr (self, element_type)
>
>> ....: print "var = "+ repr(var)
>> ....: obj = var[element_name] #O(1) average, O(n) worst case
>
> no entiendo qué estás queriendo buscar en este ejemplo, si el ejemplo es
> complicado arbitrariamente o sólo para mostrar que se puede.
Para aprender y ver que me dicen
>
>> ....: print "obj = "+ repr(obj)
>> ....: except:
>
> feíto, a lo sumo un:
>
> except KeyError:
Tenes razon
>
>> ....: print "exception"
>> ....: obj = None
>> ....: return obj
> no hay ejemplos con otro element_type, ni cómo obtener los atributos a o b.
Tampoco era la intencion, a y b eran solo para cuando imprimo el
diccionario se vieran
>
>> Las preguntas son las siguientes:
>>
>> Que otras formas conocen para realizar este tipo de tareas? (mejor si
>> son mas sencillas, rapidas, estables, etc)
>
> si lo que estás buscando es, dado una lista de objetos, filtrar aquellos
> que cumplen cierto predicado, donde el predicado generalmente tiene la forma
> 'tiene un atributo X que es de tipo Y', acceder a los __dict__'s recursivamente
> no me parece lo mas adecuado. yo haría mas bien:
>
> import types
>
> [ p for p in plugins if type (getattr (p, 'metodo_X', None))==types.MethodType ]
>
> si no es esto lo que buscas, vas a tener que ser mas claro.
Esto lo voy a probar ahorita
Creo que con las respuestas hasta ahora aprendi bastante y tengo para
continuar, gracias :)
Saludos
Leo
--
Ing. Leonardo Manuel Rocha
Ingénieur Expert
INRIA Sophia Antipolis
Projet PULSAR
+33(0)49238 5007
leonardo.rocha en inria.fr
More information about the pyar
mailing list