为何我的函数装饰器调用报错:'NoneType'对象不可调用?
解决装饰器导致的
TypeError: 'NoneType' object is not callable错误 嘿,我一眼就瞅出问题啦!你遇到的这个TypeError: 'NoneType' object is not callable错误,根源十有八九是装饰器的返回语句缩进出错了——你大概率把return wrap写进了内部的wrap函数里,而不是放在外层decorate函数的末尾。
错误原因拆解
当你用@decorate语法装饰send_message时,Python会自动执行send_message = decorate(send_message)。如果decorate函数没有返回我们定义好的wrap函数,它就会默认返回None,这时候send_message就被赋值成了None,你再去调用它自然就会触发“无法调用NoneType对象”的错误。
修正后的完整代码
name = "Arthur" message = "Hello!" def decorate(func_to_decorate): def wrap(*args, **kwargs): print ("........................") func_to_decorate(*args, **kwargs) print ("........................") # 确保return语句属于外层的decorate函数 return wrap @decorate def send_message(your_name="unassigned", your_message="blank"): print(your_name) print(your_message) send_message(name, message)
额外的好习惯提示
虽然这次你的send_message函数没有返回值,但如果后续需要让原函数的返回值正常传递,建议在wrap函数里加上返回语句:
def wrap(*args, **kwargs): print ("........................") # 接收并返回原函数的执行结果 result = func_to_decorate(*args, **kwargs) print ("........................") return result
内容的提问来源于stack exchange,提问作者Staxks
相关产品推荐
相关产品推荐

