python 装饰器是否立即调用返回的回调?

Are python decorators invoke the returned callback immediately?

我试图通过做一些实验来理解装饰器的行为。我找不到关于我所看到内容的任何文档,所以可能有人可以指出一些东西。

这是使用装饰器的代码:

def register():
    def func_wrapper(func):
        print 'registered'
    return func_wrapper

@register()
def main_page_func():
    pass

当您 运行 这段代码时,您将打印出 "registered" 这个词:

registered

这大概是没有装饰器的等效(?)代码:

def register(func):
    def func_wrapper():
        print 'registered'
    return func_wrapper


def main_page_func():
    pass

main_page_func = register(main_page_func)

当您 运行 执行上述操作时,不会打印任何内容。我理解这种情况:返回 func_wrapper 回调。

但是,我仍在为第一个使用装饰器的情况而苦苦挣扎:Why is print statement being invoked given that main_page_func 永远不会被调用?

谢谢。

删除装饰器后面的括号,它就会像你期望的那样工作。

此外,您的寄存器函数应该采用参数 func,但不一定是您的内部函数。

当你说,

@register()

它实际上调用了函数 register() 并在那里使用了 return 值,它将是 func_wrapper,它接受一个函数对象作为输入。所以,你所做的是

@func_wrapper
def main_page_func():
    pass

当你这样装饰它时,

main_page_func = func_wrapper(main_page_func)

func_wrapper 被调用,这就是 registered 被打印的原因。

要真正解决这个问题,您需要将函数对象传递给 register 本身,就像在您的第二个示例中一样,

def register(func):         # func should be here
    def func_wrapper():     # not here
        print 'registered'
    return func_wrapper


@register                   # no parens after `register`
def main_page_func():
    pass

现在,评价是这样的

main_page_func = register(main_page_func)

由于 func_wrapper 尚未执行,因此您不会看到 registered 被打印出来。