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

Python装饰器如何检查函数返回值并按需修改返回结果?

问题分析与解决方案

我来帮你梳理下代码里的问题,以及如何调整达到你的期望效果:

核心问题点

  • 参数传递错误:你在wrapping函数里调用f(args)时,args是一个元组(比如传入x=1时,args是(1,)),这相当于把元组直接传给了f(x),函数返回的就是这个元组(1,),这就是输出里出现(1,)的原因,而不是你想要的原函数返回值1。
  • 冗余函数调用:当前代码里重复调用了三次原函数(print(f(args))、if f(args) ==1、return f(*args,**kwargs)),不仅效率低,还可能在原函数有副作用时引发意外问题。

修正后的代码

from functools import wraps

def decorator(f):
    @wraps(f)
    def wrapping(*args, **kwargs):
        # 仅调用一次原函数,获取正确的返回值并保存
        result = f(*args, **kwargs)
        # 打印原函数的返回值
        print(result)
        # 判断返回值是否为1,满足条件则返回True
        if result == 1:
            return True
        # 否则返回原函数的结果
        return result
    return wrapping

@decorator
def f(x):
    return x

x = 1
print(f(x))

代码说明

  1. 正确调用原函数:用f(*args, **kwargs)展开参数传递给原函数,确保参数能被正确接收,得到预期的返回值。
  2. 复用返回值:将原函数的返回值存入result变量,后续逻辑直接复用该变量,避免多次调用原函数。
  3. 按需求输出与返回:先打印原函数的返回值,再判断是否返回True或原结果。

运行这段代码后,输出会是:

1
True

完全符合你的期望。

内容的提问来源于stack exchange,提问作者Veljko

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.13 07:32:45