Loguear clase

Milton Galo Patricio Inostroza Aguilera minoztro en gmail.com
Jue Nov 27 15:13:02 CET 2008


2008/11/27 Oswaldo Hernández <listas en soft-com.es>:
> Julio Canto escribió:
>>
>> Oswaldo Hernández escribió:
>>>
>>> Hola,
>>>
>>> Estoy intentando loguear todas las llamadas a metodos de una clase,
>>> incluyendo los argumentos que reciben, para posteriormente poder
>>> reproducirlos.
>>>
>>> Utilizando __getattribute__ intercepto las llamadas a los metodos, pero
>>> no tengo acceso a los argumentos que reciben.
>>>
>>> He estado viendo los decoradores, pero no veo como hacer un decorador
>>> que se implemente a nivel de clase y modifique todos sus metodos.
>>
>> Puedes probar con sys.settrace
>>
>
> Creo que sys.settrace es demasiado para lo que pretendo, solo quiero loguear
> las llamadas a metodos, con sus respectivos argumentos, de una clase en
> concreto.

y por qué no lo intentas y luego que obtengas resultados positivos
puedes optimizar tu solución....le he dado vuelto de hacerlo sin
settrace y llegué a esta conclusión, claro primero muestro mi código

import inspect
class Persona(object):

    def __init__(self):
        self.nombre = 'Galo'
        self.apellido = 'Patricio'

    def datos(self, theEdad):
        print inspect.currentframe().f_locals
        print self.nombre,self.apellido,theEdad

    def __getattribute__(self, theAttr):
        theObject = object.__getattribute__(self,theAttr)
        if inspect.ismethod(theObject):
            theCode = self.__class__.__dict__[theAttr].func_code
            print theCode.co_varnames[:theCode.co_argcount]
            print inspect.currentframe().f_locals
        return theObject

if __name__ == '__main__':
    thePersona = Persona()
    thePersona.datos(50)


si te fijas en el método __getattribute__ saco el objeto de la
superclase para luego preguntar si es un método (lo que necesitas),
luego de eso (esto no se si será saludable, pero se me ocurrió así)
voy a la clase de la instancia y saco de su diccionario el objeto
función que representa al método y luego saco su objeto code.  luego
de eso imprimo los argumentos, que siempre estarán al principio de la
tupla co_varnames.  Hasta ahí todo exitoso, luego voy a sacar el frame
actual y preguntar por sus variables locales (sabiendo de antemano que
estaré viendo el frame actual), ajá! no sirve de esta forma...por
qué?, fijate que __getattribute__ intercepta el llamado a función por
lo tanto estamos antes de la llamada de la misma, por lo que me
imagino que no se genera el frame y si no tenemos frame no tenemos
espacio para poner el valor de nuestros argumentos =( (bueno aparte de
otras cosas...no estoy seguro pero esto está relacionado con el
scope)...fijate que luego saco el diccionario local del método datos y
bueno ahí si que funciona.  La gracia de settrace es que te captura el
evento call y ¿qué crees que envía como argumento?, exacto! el frame
actual de donde puedes sacar toda esta información.

>
> Gracias.
>
>
> --
> *****************************************
> Oswaldo Hernández
> oswaldo (@) soft-com (.) es
> *****************************************
> PD:
> Antes de imprimir este mensaje, asegúrese de que es necesario.
> El medio ambiente está en nuestra mano.
> _______________________________________________
> Lista de correo Python-es http://listas.aditel.org/listinfo/python-es
> FAQ: http://listas.aditel.org/faqpyes
>



-- 
Milton Inostroza Aguilera
------------ próxima parte ------------
_______________________________________________
Lista de correo Python-es 
http://listas.aditel.org/listinfo/python-es
FAQ: http://listas.aditel.org/faqpyes


Más información sobre la lista de distribución Python-es