gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 15:09:17 28 4
gpt4 key购买 nike

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

下面是使用装饰器的代码:

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 回调被返回。

但是,我仍然在为第一个使用装饰器的情况而苦苦挣扎:为什么 print 语句被调用,因为 main_page_func 从未被调用?

谢谢。

最佳答案

当你说,

@register()

它实际上调用函数 register() 并在那里使用返回值,这将是 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 被打印出来。

关于python - python装饰器是否立即调用返回的回调?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28976356/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com