gpt4 book ai didi

python - 为什么这个函数装饰器失败了?

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

这是我的代码:

name    = "Arthur"
message = "Hello!"

def decorate(func_to_decorate):

def wrap(*args, **kwargs):

print ("........................")
func_to_decorate(*args, **kwargs)
print ("........................")
return wrap


@decorate
def send_message(your_name="unassigned", your_message="blank"):

print(your_name)
print(your_message)

send_message(name, message)

我的错误在第 20 行:

send_message(name, message)
TypeError: 'NoneType' object is not callable

我的理解是,包装器正在用紧随装饰器之后的函数“替换”自身。当我不将参数传递给正在装饰的函数但不存在装饰器时,这似乎有效。

最佳答案

你的装饰器有两个问题。

首先,存在缩进错误:

def decorate(func_to_decorate):

def wrap(*args, **kwargs):

print ("........................")
func_to_decorate(*args, **kwargs)
print ("........................")
return wrap

返回包装wrap函数体的一部分,而不是decorate函数体的一部分。因此,decorate 没有 return 语句,这意味着它返回 None。因此,您会看到错误:装饰器实际上用它返回的包装器“替换”了包装的函数,但该包装器是 None,因此您最终会尝试调​​用 None > 作为一个函数。

同时,您似乎明白 wrap 应该返回一些东西,但该东西绝对不应该是本身。通常,您想要返回的是包装函数的结果(或该结果的某些后处理版本)。在您的测试中,您只是尝试包装一个仅用于副作用的函数,更不用说由于第一个问题而您永远无法调用包装器,因此您还不会注意到这个问题,但是你仍然想修复它。

所以:

def decorate(func_to_decorate):

def wrap(*args, **kwargs):

print ("........................")
retval = func_to_decorate(*args, **kwargs)
print ("........................")
return retval

return wrap

关于python - 为什么这个函数装饰器失败了?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49621089/

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