2009-03-09 6 views
2

J'ai essayé de tracer l'exécution de certaines méthodes en utilisant un décorateur. Voici le code de décorateur:Comment puis-je transmettre tous les paramètres à un 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 

La chose est, si j'essaie d'appliquer ce décorateur aux méthodes, le paramètre auto ne soit pas envoyé. Pouvez-vous me dire pourquoi, et comment puis-je résoudre ce problème?

+1

Quel est le point de xargs = args? vous pouvez simplement passer des arguments à l'opérateur% directement. – Algorias

Répondre

6

Cette ligne est incorrecte:

ret_val = func(args) 

Vous oubliez d'élargir la liste des arguments lorsque vous le transmettre. Il devrait être:

ret_val = func(*args) 

sortie de l'échantillon 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 jamais votre décorateur de prendre aussi des arguments de mots clés, vous aurez besoin également d'étendre les correctement lors de leur passage sur, en utilisant **.

+0

Les deux listes d'arguments devraient lire '(* args, ** kwargs)' pour gérer les fonctions/méthodes avec des arguments de mots-clés. – Ber

Questions connexes