修饰符错误:NoneType对象不是callab

2024-10-01 07:34:48 发布

您现在位置:Python中文网/ 问答频道 /正文

我写了这样一个函数修饰符:

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

我收到以下错误消息:

^{pr2}$

我用“foo()”替换“foo()”就可以了。但我还是没有得到我期望的结果:

foo() called

似乎foo函数只调用一次。在

请帮我理解为什么会发生这种事。在


Tags: to函数namegetreturnfoodefit
2条回答

您应该返回包装器函数本身,而不是其结果

def tsfunc(func):
    def wrappedFunc():
        print '%s() called' % func.__name__
        return func()
    return wrappedFunc   # Do not call the function, return a reference instead

Decorators用decorator的返回值替换装饰项:

^{pr2}$

相当于:

def foo():
    # ....
foo = tsfunc(foo)

扩展到(在您的代码中):

foo = wrappedFunc()

所以您用wrappedFunc()调用的结果替换函数foo,而不是wrappedFunc本身。在

您需要删除中的括号

return wrappedFunc

decorator应该返回包装器函数,而不是调用它。在

使用此修复程序,代码将生成:

^{pr2}$

相关问题 更多 >