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

如何避免Python装饰器输出中混入None值?

解决装饰器输出中出现None的问题

问题原因

你遇到的None输出来自两个连锁问题:

  1. 装饰器的inner_func里,你返回了print(...)的执行结果,但**print()函数本身的返回值就是None**,导致被装饰后的函数(add、sub)都会返回None。
  2. 测试代码里用print(add(3,4))调用函数,相当于先触发装饰器的打印逻辑输出调用信息,再打印被装饰函数返回的None,因此每条结果后会多出一行None。

解决方案

方案一:调整装饰器职责(推荐)

让装饰器只负责打印调用信息,同时返回原函数的执行结果,避免返回print的None值。

修改后的装饰器代码:

def debug(func):
    """
    :param func: function
    """
    def inner_func(*args,**kwargs):
       answer = func(*args,**kwargs)
       print(f"{func.__name__}{args} was called and returned {answer}")
       return answer  # 返回原函数结果,而非print的返回值
  
    return inner_func

同时修改测试代码,去掉外层的print(因为装饰器已经完成打印逻辑):

def add(a, b):
    return a + b
    
@debug
def sub(a, b=100):
    return a - b

add(3, 4)
sub(3)
sub(3,4)

运行后即可得到期望输出:

add(3, 4) was called and returned 7
sub(3,) was called and returned -97
sub(3, 4) was called and returned -1

可选优化:让参数显示更美观

如果觉得sub(3,)里的逗号看着别扭,可以优化参数拼接逻辑,让输出更贴近实际调用格式:

def debug(func):
    def inner_func(*args,**kwargs):
        answer = func(*args,**kwargs)
        # 拼接位置参数和关键字参数
        args_str = ", ".join(map(str, args))
        kwargs_str = ", ".join([f"{k}={v}" for k, v in kwargs.items()])
        all_args = ", ".join(filter(None, [args_str, kwargs_str]))
        print(f"{func.__name__}({all_args}) was called and returned {answer}")
        return answer
    return inner_func

此时调用sub(3)会输出sub(3) was called and returned -97,格式更符合预期。


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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.24 16:24:19