为日志着色——装饰器的一个简单实践
内容提要
本文介绍如何用Python装饰器为命令行日志着色:通过ANSI转义序列设置颜色,用字典get方法替代switch选择颜色,并借助带参数的装饰器根据函数返回文本的前缀(SUCCESS、WARNING、ERROR)自动匹配颜色,实现彩色输出。装饰器常用于缓存、性能分析、日志和同步等场景。
延伸解读
装饰器参数化的实现要点
文章中的 colorize 装饰器需要接收颜色参数,因此采用了三层嵌套函数:最外层接收参数,中间层接收被装饰函数,最内层执行包装逻辑。这种结构是带参数装饰器的典型写法,理解它有助于掌握装饰器工厂模式。
用字典模拟 switch 的实用技巧
Python 没有 switch-case,文章利用字典的 get 方法根据颜色名返回对应的 ANSI 转义序列,并设置默认空字符串。这种方法简洁且可读性好,同样适用于根据日志级别映射颜色,避免了冗长的 if-elif 链。
ANSI 转义序列的跨平台限制
文章使用 ANSI 转义序列为文本着色,这在 Linux 和 macOS 终端中通常有效,但在部分 Windows 命令行中可能无法正常显示。若需跨平台支持,可能需要额外处理或使用第三方库。
Q&A
Python装饰器是什么?
装饰器是一个通过闭包修改其他函数的函数。
如何在命令行中给文本着色?
使用ANSI转义序列,将文本放在颜色转义序列和重置转义序列之间。例如:ORANGE = '\033[33m',RESET = '\033[0m',然后print ORANGE + "文本" + RESET。
Python中如何替代switch case选择颜色?
使用字典的get方法。例如:return { 'red': '\033[31m', 'green': '\033[32m' }.get(color, ""),如果颜色不存在则返回空字符串。
如何编写带参数的装饰器?
需要将装饰器放在另一个装饰器内部。例如:def colorize(*args): def _colorize(): def wrapper(): ... return wrapper return _colorize,然后使用@colorize("green", "orange", "red")。
如何根据函数返回文本的前缀自动着色?
在装饰器内部,获取函数返回的文本,用split(':', 1)[0]提取前缀(如SUCCESS、WARNING、ERROR),然后通过字典映射到对应颜色,最后用getColor获取转义序列并格式化输出。
装饰器通常用于哪些场景?
装饰器常用于缓存、性能分析、日志、同步(获取锁、释放锁)等场景。