Python 代码注释 _locale._getdefaultlocale = (lambda *args: ['zh_CN', 'utf8']) 猴子补丁 Monkey Patch
if sys.platform == "win32":
import _locale
_locale._getdefaultlocale = (lambda *args: ['zh_CN', 'utf8'])
代码逐行解释
if sys.platform == "win32":
import _locale
_locale._getdefaultlocale = (lambda *args: ['zh_CN', 'utf8'])
1. sys.platform == "win32"
sys.platform获取当前操作系统平台标识"win32":代表 Windows 系统(不管是 32 位还是 64 位 Windows,都返回 win32)
作用:只在 Windows 下执行这段代码;Linux/macOS 直接跳过
2. import _locale
_locale 是 Python 内置底层模块,用来读取操作系统的区域语言编码(locale)。 Windows 上很多时候默认 locale 编码是 cp936(GBK),不是 utf-8。 很多库(pandas、matplotlib、日志、多语言文本)会调用 _locale._getdefaultlocale() 获取系统默认编码。
3. _locale._getdefaultlocale = (lambda *args: ['zh_CN', 'utf8'])
_getdefaultlocale:是_locale模块内部函数,原本作用:读取 Windows 系统,返回 (语言名称,编码),例如原本返回['zh_CN', 'cp936']lambda *args: ['zh_CN', 'utf8']:匿名函数,不管传入什么参数,固定返回列表:['zh_CN', 'utf8']- 这一行:猴子补丁(monkey patch),直接替换掉 Python 底层
_locale的这个函数。
效果:强制让所有调用
_getdefaultlocale()的代码,认为系统区域是中文、编码为 UTF-8,而不是 Windows 原生 GBK (cp936)。
✅ 这段代码的目的
解决 Windows 下 Python 默认 locale 为 GBK,导致的中文乱码、编码报错问题 常见报错:
UnicodeEncodeError: 'gbk' codec can't encode character- matplotlib 图表中文乱码
- 日志输出、文件读写中文异常
⚠️ 重要缺点和坑(工业代码里要注意)
_locale是私有底层模块(下划线开头),不属于官方稳定 API。Python 版本升级有可能改动 / 移除,代码失效。- 猴子补丁,全局生效:一旦执行,整个 Python 进程内所有依赖 locale 编码的逻辑都会被篡改。某些依赖 GBK 编码的老 Windows 程序会反而出错。
- 不能真正修改 Windows 系统本身编码,只欺骗 Python 内部读取 locale 的函数。
- 顺序要求:必须在导入其他受 locale 影响的库(matplotlib/pandas 等)之前执行;导入之后再打补丁无效。
对比:更推荐的现代写法(Python3.10+)
现在更推荐用环境变量,而不是修改私有_locale:
import os
if sys.platform == "win32":
os.environ["PYTHONUTF8"] = "1"
设置PYTHONUTF8=1,官方支持的方式,让 Windows Python 全局使用 UTF-8,更加稳定,没有修改私有底层模块的风险。
一句话总结
Windows 平台下,通过猴子补丁,劫持 Python 底层读取系统区域编码的函数,强制返回中文 + UTF8,用来规避 GBK 带来的中文乱码;但属于 hack 写法,稳定性不如设置
PYTHONUTF8环境变量。
============================================
猴子补丁 Monkey Patch(极简版)
一句话:程序运行起来之后,在不修改源码文件的前提下,动态替换掉某个类 / 模块里面的函数、变量,改变它原有行为。
拿刚才代码举例
原本:_locale._getdefaultlocale() 会去读取 Windows 系统,返回 ['zh_CN','cp936'] 运行时我们直接写:
_locale._getdefaultlocale = lambda *args: ['zh_CN', 'utf8']
👉 直接把这个底层函数 “换掉”,没有改 Python 源码文件,只是在当前进程内存里覆盖。 后续任何地方调用这个函数,都会执行我们写的 lambda,不再调用原来的逻辑。
特点
✅ 优点:不用改第三方库 / 底层源码,临时修正 bug、改行为很方便。 ❌ 缺点:
- 属于 “黑科技”,不是标准 API;库版本升级,内部函数可能改名,补丁直接失效。
- 全局生效,会影响整个程序所有地方,容易产生意想不到的副作用。
- 代码可读性差,别人读代码很难发现底层函数被偷偷替换了。
通俗比喻
就像:出厂的遥控器按键本来是开灯。你不拆开遥控器改电路板,外接一个小装置,按下这个按键,实际变成开风扇。遥控器本身文件 / 硬件没改动,但运行时行为变了。
工业项目原则:尽量少用猴子补丁;优先用环境变量、配置参数这类正规方案。

浙公网安备 33010602011771号