Python装饰器报'NoneType' object is not callable错误
报错根因
问题出在带参数装饰器的嵌套函数缺少必要的返回语句,不符合Python装饰器的执行逻辑:
- 带参数的装饰器语法
@multi_print(2)执行时,会先运行multi_print(2),它的返回值才是实际用来修饰目标函数的装饰器。原代码中multi_print只定义了内部的decorator但没有返回它,函数默认返回None,后续Python尝试调用None去处理被装饰的if_num函数,直接触发'NoneType' object is not callable错误。 - 就算补上第一层返回,内部的
decorator函数也缺少返回wrapper的语句,装饰后if_num会被替换成None,调用时依然会报相同错误。带参数的三层装饰器结构,两层嵌套都必须显式返回对应的内部函数对象。
修复代码
给两层嵌套函数补上返回语句,同时补全wrapper调用原函数时的关键字参数透传,避免原函数接收关键字参数时出现异常,完整可运行代码如下:
import numpy as np def multi_print(n): def decorator(func): def wrapper(*args, **kwargs): for z in np.arange(n): print(func(*args, **kwargs)) # 返回包装后的函数替换原被装饰函数 return wrapper # 返回实际的装饰器对象 return decorator @multi_print(2) def if_num(x): if x == 1: return 'abc' else: return 'def' if_num(3)
运行上述代码,会按照预期连续打印两次def。
内容的提问来源于stack exchange,提问作者OzzyLee
相关产品推荐
相关产品推荐

