2009-03-09 10 views
2

Ich habe versucht, die Ausführung einiger Methoden mit einem Dekorator zu verfolgen. Hier ist der Dekorateur Code:Wie kann ich alle Parameter an einen Dekorateur übergeben?

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 

Die Sache ist, wenn ich versuche, diesen Dekorateur Methoden anwenden, wird der Selbst Parameter nicht gesendet bekommen. Kannst du mir sagen warum und wie kann ich das beheben?

+1

Was ist der Sinn von xargs = args? Sie können Argumente direkt an den Operator% übergeben. – Algorias

Antwort

6

Diese Zeile ist falsch:

ret_val = func(args) 

Sie vergessen die Argumentliste zu erweitern, wenn Sie es sind vorbei auf. Es sollte sein:

ret_val = func(*args) 

Beispielausgabe mit dieser Modifikation anstelle:

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

Wenn Sie Ihren Dekorateur erweitern auch Keyword-Argumente zu nehmen, werden Sie auch die entsprechend erweitern müssen, wenn sie vorbei mit **.

+0

Beide Argumentlisten sollten '(* args, ** kwargs)' lesen, um auch Funktionen/Methoden mit Schlüsselwortargumenten zu behandeln. – Ber

Verwandte Themen