所以我很新,决定尝试装饰器,基本上它在显示名称之前添加“开始”,然后添加“结束”。非常简单,并且有效,但是我收到 NoneType 错误?def start_end_decorator(func): def wrapper(): print("Start") func() print("End") return wrapper()@start_end_decoratordef print_name(): print ('Nero')print_name()这是输出:line 13, in <module> print_name()TypeError: 'NoneType' object is not callableStartNero我很困惑?我应该忽略它并尝试/例外吗?结尾
3 回答
忽然笑
TA贡献1806条经验 获得超5个赞
该函数wrapper
中没有 return 语句,因此它返回None
。因此 start_end_decorator() 中的这一行:
return wrapper()
返回None
。您的意图肯定是返回函数,而不是函数的返回值。尝试将该语句更改为:
return wrapper
阿波罗的战车
TA贡献1862条经验 获得超6个赞
装饰器必须返回一个可调用对象。 start_end_decorator
但是,正在返回 的返回值wrapper
。由于wrapper
没有return
声明,None
因此隐式返回。 None
不是可调用对象,因此会出现错误。
你想要的是从你的装饰器返回wrapper
而不是wrapper()
.
慕桂英3389331
TA贡献2036条经验 获得超8个赞
def start_end_decorator(func):
def wrapper(*args,**kwargs):
print('start')
result=func(*args,**kwargs)
print('End')
return result
return wrapper
@start_end_decorator
def add(x): print (x) return x+5
结果=添加(100)打印(结果)
O/P:开始 100 结束 105
添加回答
举报
0/150
提交
取消