Question

J'ai essayé de suivre l'exécution de certaines méthodes à l'aide d'un décorateur. Voici le code du décorateur:

def trace(func):
    def ofunc(*args):
        func_name = func.__name__       
        xargs = args        
        print "entering %s with args %s" % (func_name,xargs)
        ret_val = func(args)
        print "return value %s" % ret_val
        print "exiting %s" % (func_name)
    return ofunc 

Le problème, c’est que si j’essaie d’appliquer ce décorateur à des méthodes, le paramètre self ne sera pas envoyé. Pouvez-vous me dire pourquoi et comment puis-je résoudre ce problème?

Était-ce utile?

La solution

Cette ligne est incorrecte:

ret_val = func(args)

Vous oubliez d’élargir la liste d’arguments lorsque vous la transmettez. Ce devrait être:

ret_val = func(*args)

Exemple de sortie avec cette modification en place:

>>> class Test2:
...     @trace
...     def test3(self, a, b):
...        pass
... 
>>> t = Test2()
>>> t.test3(1,2)
entering test3 with args (<__main__.Test2 instance at 0x7ff2b42c>, 1, 2)
return value None
exiting test3
>>> 

Si vous développez un jour votre décorateur pour qu'il prenne également des arguments de mots clés, vous devrez également les développer de manière appropriée lors de leur transmission en utilisant ** .

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top