我写了一个这样的函数装饰器:
def tsfunc(func):
def wrappedFunc():
print '%s() called' % func.__name__
return func()
return wrappedFunc()
@tsfunc
def foo():
pass
foo() # to get it work, use foo instead of foo()
foo()
我收到以下错误消息:
foo() called
Traceback (most recent call last):
File "decorator.py", line 11, in <module>
foo()
TypeError: 'NoneType' object is not callable
我通过将“foo()”替换为“foo”来使其工作。但我仍然没有得到我期望的结果:
foo() called
似乎是foo
函数仅被调用一次。
请帮助我理解为什么会发生这种情况。
您应该返回包装函数本身,不是它的结果:
def tsfunc(func):
def wrappedFunc():
print '%s() called' % func.__name__
return func()
return wrappedFunc # Do not call the function, return a reference instead
装饰器用装饰器的返回值替换被装饰的项:
@tsfunc
def foo():
# ....
相当于:
def foo():
# ....
foo = tsfunc(foo)
它扩展到(在您的代码中):
foo = wrappedFunc()
所以你要替换这个函数foo
的结果是wrappedFunc()
打电话,不与wrappedFunc
itself.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)