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))
代码说明
- 正确调用原函数:用
f(*args, **kwargs)展开参数传递给原函数,确保参数能被正确接收,得到预期的返回值。 - 复用返回值:将原函数的返回值存入
result变量,后续逻辑直接复用该变量,避免多次调用原函数。 - 按需求输出与返回:先打印原函数的返回值,再判断是否返回
True或原结果。
运行这段代码后,输出会是:
1 True
完全符合你的期望。
内容的提问来源于stack exchange,提问作者Veljko
相关产品推荐
相关产品推荐

