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
被打印出来。
我试图通过做一些实验来理解装饰器的行为。我找不到关于我所看到内容的任何文档,所以可能有人可以指出一些东西。
这是使用装饰器的代码:
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
被打印出来。