所以我很新手,决定尝试一下装饰器,基本上它在显示名称之前添加了"Start“,在显示名称之后添加了"End”。很简单,它可以工作,但是我得到了一个NoneType错误?
def start_end_decorator(func):
def wrapper():
print("Start")
func()
print("End")
return wrapper()
@start_end_decorator
def print_name():
print ('Nero')
print_name()下面是输出:
line 13, in <module>
print_name()
TypeError: 'NoneType' object is not callable
Start
Nero我真的很困惑?我是否应该忽略它,也许可以尝试一下/例外一下?结束
发布于 2020-10-21 09:13:34
函数wrapper中没有return语句,因此它返回None。因此,start_end_decorator()中的这一行:
return wrapper()返回None。您的意图肯定是返回函数,而不是函数的返回值。尝试将该语句更改为:
return wrapper发布于 2020-10-21 09:12:37
装饰器必须返回一个可调用的对象。但是,start_end_decorator将返回wrapper的返回值。由于wrapper没有return语句,因此将隐式返回None。None不是一个可调用的对象,因此出现错误。
你想要的是从你的装饰器返回wrapper而不是wrapper()。
https://stackoverflow.com/questions/64455280
复制相似问题