Frage

Ich habe versucht, die Ausführung einiger Methoden mit einem Dekorateur zu verfolgen. Hier ist der Dekorateur Code:

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. Können Sie mir sagen, warum, und wie kann ich das Problem beheben?

War es hilfreich?

Lösung

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)

Beispiel für eine Ausgabe mit dieser Änderung in Stelle:

>>> 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, würden Sie auch die entsprechend erweitern müssen, wenn sie beim Passieren, ** verwendet wird.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top