Python装饰器失效求助:使用@by2装饰add函数触发TypeError错误
解决装饰器使用中的TypeError问题
哦,我明白你遇到的问题了——这是装饰器的典型用法误区,我来帮你理清楚:
错误原因
当你用@by2装饰add函数时,Python会自动执行add = by2(add)。而你写的by2函数直接把传入的函数对象和整数2做乘法运算,这显然是不合法的(函数和int类型不支持*操作),所以触发了TypeError。
装饰器的核心逻辑应该是:接收被装饰的函数作为参数,返回一个新的包装函数,这个包装函数可以在原函数执行前后添加额外逻辑。
修正后的代码
把by2改成标准的装饰器结构,让它返回一个内部函数,在内部函数里调用原函数并处理结果:
def by2(func): # 定义包装函数,接收原函数的参数 def wrapper(a, b): # 调用原函数得到结果 result = func(a, b) # 对结果乘2后返回 return result * 2 # 返回包装函数 return wrapper @by2 def add(a,b): return a+b print(add(2,5)) # 输出:14
更通用的写法(适配任意参数的函数)
如果你的装饰器想适配不同参数的函数,可以用*args和**kwargs来接收任意参数:
def by2(func): def wrapper(*args, **kwargs): result = func(*args, **kwargs) return result * 2 return wrapper @by2 def add(a,b): return a+b @by2 def multiply(x,y,z): return x*y*z print(add(2,5)) # 输出:14 print(multiply(2,3,4))# 输出:48
这样不管被装饰的函数有多少个参数,装饰器都能正常工作啦。
内容的提问来源于stack exchange,提问作者Jack Peter
相关产品推荐
相关产品推荐

