[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