为日志着色——装饰器的一个简单实践

💡 原文英文,约600词,阅读约需3分钟。
📝

内容提要

本文介绍如何用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获取转义序列并格式化输出。

装饰器通常用于哪些场景?

装饰器常用于缓存、性能分析、日志、同步(获取锁、释放锁)等场景。

🏷️

标签

➡️

继续阅读