gpt4 book ai didi

python - python装饰器函数流程

转载 作者:太空宇宙 更新时间:2023-11-03 11:01:45 25 4
gpt4 key购买 nike

我试图理解我发现的解释装饰器的以下示例:

#!/usr/bin/python

def get_text(name):
return "lorem ipsum, {0} dolor sit amet".format(name)

def p_decorate(func):
def func_wrapper(name):
return "<p>{0}</p>".format(func(name))
#return "1"
return func_wrapper


get_text = p_decorate(get_text)

print get_text("John")

这个的输出是:

<p>lorem ipsum, John dolor sit amet</p>

我决定尝试更改此函数并注释掉 return func_wrapper 并将其替换为 return "1"

当我这样做时,出现错误:

TypeError: 'str' object is not callable

我有两个问题:

  1. 当行

    print get_text("John") 

    被执行,是

    def func_wrapper(name):

    "John" 初始化?此行运行后的事件顺序是什么?

  2. 为什么我会收到此错误,因为最终返回的不是 string 吗?

如果有人能用这段代码解释事件的流程,我将不胜感激。

最佳答案

你在这里调用了装饰器:

get_text = p_decorate(get_text)

通常,装饰器会用另一个可调用函数(例如另一个函数)替换一个函数,或者返回原始函数但已注册有关它的信息。

但是通过将 p_decorate() 的返回值更改为 "1" 而不是函数包装器,您“破坏”了 get_text 作为那现在不再是一个功能。您不能像调用字符串那样调用字符串对象。

之前,p_decorate() 返回了 func_wrapper() 函数对象,因此 get_text 被重新指向该函数。调用 get_text('John') 确实调用了该嵌套函数。 func_wrapper() 然后确实以 'John' 作为参数调用,是的。函数毕竟只是对象,您可以将这些对象分配给您喜欢的任何有效的 Python 名称。

func_wrapper() 被调用时,它会依次调用 func(),这是 p_decorate() 的参数。同样,函数只是对象,所以在调用了 p_decorate(get_text) 之后,func 最终仍然绑定(bind)到原始的 get_text 函数对象。调用 func() 调用原始函数。

您可以在 Python Tutor 中看到完整的调用流程.

关于python - python装饰器函数流程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/31143057/

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