我试图使用装饰器跟踪一些方法的执行.这是装饰器代码:
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
问题是,如果我尝试将此装饰器应用于方法,则不会发送self参数.你能告诉我为什么,我该如何解决这个问题?
这行不正确:
ret_val = func(args)
当你传递参数列表时,你忘了扩展参数列表.它应该是:
ret_val = func(*args)
具有此修改的示例输出:
>>> 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 >>>
如果你曾经扩展你的装饰器也采取关键字参数,你还需要在使用时传递它们**
.