
本文介绍一种基于 ANSI 转义序列的轻量级方案,通过 change_color() 函数统一控制后续所有 print() 输出的颜色,避免逐行添加样式代码,适用于批量日志着色、调试高亮等场景。
本文介绍一种基于 ansi 转义序列的轻量级方案,通过 `change_color()` 函数统一控制后续所有 `print()` 输出的颜色,避免逐行添加样式代码,适用于批量日志着色、调试高亮等场景。
要实现“调用一次 change_color(color) 后,所有后续 print() 自动以指定颜色输出”,关键在于重写 print 函数的行为,而非仅封装一个新函数。原答案中提供的 print_colored() 是手动调用方式,不符合题设“所有文本自动变色”的需求。下面给出真正符合要求的专业解决方案:
✅ 核心思路:动态重定向 print 函数
我们通过 functools.partial 或自定义 print 替代函数,结合全局颜色状态,在每次调用时自动注入当前 ANSI 前缀与重置码。
Python 3.14.2是Python编程语言在2025年12月5日发布的稳定版本,属于3.14系列的第二个维护更新。该版本包含了18项修复,重点解决了多进程、数据类及正则表达式等模块的回归问题,并修复了CVE-2025-12084等安全漏洞。此版本标志着自由线程模式(移除GIL)正式获得官方支持,是Python发展的重要里程碑。
import functools
import sys
class ColorManager:
RESET = "\033[0m"
RED = "\033[31m"
GREEN = "\033[32m"
YELLOW = "\033[33m"
BLUE = "\033[34m"
PURPLE = "\033[35m"
CYAN = "\033[36m"
WHITE = "\033[37m"
_current_color = RESET
@classmethod
def change_color(cls, color: str):
"""设置后续所有 print 的默认前景色"""
color_code = getattr(cls, color.upper(), None)
if color_code is None:
raise ValueError(f"Unsupported color: {color}. "
f"Use: red, green, yellow, blue, purple, cyan, white")
cls._current_color = color_code
@classmethod
def _colored_print(cls, *args, **kwargs):
"""内部封装的彩色 print,自动添加颜色前缀与重置"""
# 构造带颜色的字符串(仅对第一个字符串参数生效,兼容多参数)
if args:
first = str(args[0])
rest = args[1:]
colored_first = cls._current_color + first + cls.RESET
new_args = (colored_first,) + rest
else:
new_args = args
# 使用原始 print 输出(支持 sep/end/file/flush 等所有参数)
print(*new_args, **kwargs)
# 全局启用:替换内置 print(仅限当前模块作用域,安全可控)
print = ColorManager._colored_print
# ✅ 使用示例(完全匹配题设语法)
ColorManager.change_color("red")
print("Hello world!") # → 红色
print("Hi world") # → 红色
ColorManager.change_color("green")
print("Hello world!") # → 绿色
print("Hi world") # → 绿色
⚠️ 注意事项
- 终端兼容性:ANSI 颜色在绝大多数现代终端(Windows Terminal、iTerm2、GNOME Terminal、VS Code 集成终端)中均有效;但传统 Windows CMD 在旧版本需启用虚拟终端支持(Python 3.7+ 通常已自动启用)。
- 重置保障:每个输出末尾自动追加 \033[0m,防止颜色“泄漏”影响后续命令或 shell 提示符。
- 非侵入式设计:仅替换当前作用域的 print,不影响其他模块;如需全局生效,可在主模块顶部执行 print = ...。
- 性能开销极低:无 I/O 或外部依赖,纯字符串操作,适合高频日志场景。
- 扩展建议:如需背景色、加粗、下划线等,可扩展 ColorManager 类添加对应 ANSI 码(如 \033[42m 为绿色背景)。
? 恢复默认颜色
随时调用 ColorManager.change_color("reset")(需预先在类中定义 RESET = "\033[0m" 并加入映射),或直接 print("\033[0m") 清除当前行残留样式。
该方案简洁、可靠、零第三方依赖,完美满足“一次设置、全局生效”的工程化着色需求。
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










