Mininet--log.py-makeListCompatible装饰器解析
makeListCompatible
装饰器的调用位置在 log.py
的 日志初始化部分,具体流程如下:
调用位置与作用
在代码末尾的初始化阶段,原始日志方法(如 lg.info
)被 makeListCompatible
装饰器包装,生成支持多参数输入的新方法。以下是关键代码段:
# 初始化日志器和日志方法
logging.setLoggerClass(MininetLogger)
lg = logging.getLogger("mininet")
# 原始日志方法列表:lg.info, lg.output, lg.warning, lg.error, lg.debug
_loggers = lg.info, lg.output, lg.warning, lg.error, lg.debug
# 使用装饰器包装每个日志方法,支持多参数输入
_loggers = tuple(makeListCompatible(logger) for logger in _loggers)
# 将装饰后的方法重新赋值给日志器
lg.info, lg.output, lg.warning, lg.error, lg.debug = _loggers
# 导出为全局函数
info, output, warning, error, debug = _loggers
装饰器工作原理
1. 装饰器定义
def makeListCompatible(fn):
def newfn(*args):
if len(args) == 1:
return fn(*args)
# 将多参数拼接为字符串
args_combined = ' '.join(str(arg) for arg in args)
return fn(args_combined)
return newfn
2. 装饰器调用过程
- 原始方法:例如
lg.info
是一个普通的日志方法,只能接受单个参数(字符串)。 - 装饰后方法:通过
makeListCompatible(lg.info)
,生成一个新方法newfn
。- 当用户调用
info('a', 1, 'b')
时:newfn
接收到参数('a', 1, 'b')
。- 检查参数数量:
len(args) > 1
,执行拼接操作。 - 拼接后参数变为
'a 1 b'
。 - 调用原始的
lg.info('a 1 b')
。
- 当用户调用
实际效果验证
示例代码
from mininet.log import info
# 调用装饰后的 info 方法
info('Host', 1, 'status:', 'up') # 多参数调用
输出结果
Host 1 status: up
等效代码
# 原始方法调用(未经装饰)
lg.info('Host 1 status: up')
关键点总结
- 调用位置:装饰器在日志初始化阶段被批量应用到所有日志方法(
info
,output
,warning
等)。 - 作用:将多参数输入自动拼接为单个字符串,简化用户调用方式。
- 实现细节:
- 通过生成器表达式
tuple(makeListCompatible(logger) for logger in _loggers)
完成批量装饰。 - 装饰后的方法重新赋值给日志器,并导出为全局函数。
- 通过生成器表达式
通过这种方式,用户可以直接使用 info('a', 1, 'b')
的简洁语法,而无需手动拼接字符串。