You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.12 05:26:57