如何实现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
相关产品推荐
相关产品推荐

