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

如何实现log_or_not装饰器为被装饰函数新增日志级别参数

当然可以实现这个需求!

你只需要对现有的装饰器做一点小修改,让它能够动态接收并使用传入的level参数,同时避免把这个额外参数传递给原函数foo(因为原函数并没有定义这个参数,直接传会触发TypeError)。

修改后的完整代码

import logging
logging.basicConfig()

def log_or_not(func):
    def wrap_function(*args, **kwargs):
        # 从kwargs中取出level参数,默认使用logging.INFO
        log_level = kwargs.pop('level', logging.INFO)
        # 保存原有日志级别
        original_level = logging.root.level
        # 设置新的日志级别
        logging.getLogger().setLevel(log_level)
        try:
            # 执行原函数并获取结果
            result = func(*args, **kwargs)
        finally:
            # 无论函数执行是否成功,都恢复原有日志级别
            logging.getLogger().setLevel(original_level)
        return result
    return wrap_function

@log_or_not
def foo(x):
    for i in range(10):
        logging.info(f"This is iteration number {i}.")
        x += i
    return x

关键改进点说明

  • 处理level参数:用kwargs.pop('level', logging.INFO)既可以获取用户传入的级别,又能从参数列表中移除它,避免传递给原函数引发参数不匹配的错误;如果用户没传level,就默认使用logging.INFO。
  • 异常安全的级别恢复:加入try...finally块,确保即使原函数执行过程中抛出异常,也能恢复原来的日志级别,不会影响后续代码的日志输出行为。

调用示例

# 使用指定级别调用(比如DEBUG级别)
result1 = foo(x=10, level=logging.DEBUG)
# 使用默认级别调用(等价于level=logging.INFO)
result2 = foo(x=5)

这样修改后,被装饰的foo函数就完美支持新增的level参数啦!

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.27 21:37:41