[pyar] Llamadas dinamicas resueltas en tiempo de ejecucion

Marcos Dione mdione en grulic.org.ar
Jue Feb 17 15:03:54 ART 2011


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.

> 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.

>    ....:             print "obj = "+ repr(obj)
>    ....:         except:

    feíto, a lo sumo un:

                   except KeyError:

>    ....:             print "exception"
>    ....:             obj = None
>    ....:         return obj

    para mayor legibilidad, no pegues la salilda de ipython, sino el código 
derecho. además, sacale el wordwrap a tu cliente de mail.

> 
> In [92]: c =C()
> 
> In [94]: c.__dict__
> Out[94]: {'a': 1, 'b': 2, 'd': {'c': 3, 'd': 4}}
> 
> In [95]: c.gete('c')
> 1
> 2
> var = {'c': 3, 'd': 4}
> obj = 3
> Out[95]: 3
> 
> In [96]: c.gete('d')
> 1
> 2
> var = {'c': 3, 'd': 4}
> obj = 4
> Out[96]: 4

    no hay ejemplos con otro element_type, ni cómo obtener los atributos a o b.

> 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.

-- 
(Not so) Random fortune:
Microsoft is a cross between The Borg and the Ferengi. Unfortunately they use
Borg to do their marketing and Ferengi to do their programming. 
	    -- Simon Slavin



More information about the pyar mailing list