Python 3.15 已发布:UTF-8 成为默认编码,最可能咬人的是这一条
✦
← 教程与经验

Python 3.15 已发布:UTF-8 成为默认编码,最可能咬人的是这一条

楼主:超级管理员 · 2026-10-12 12:09 · 浏览 9

Python 3.15 升级
超级管理员 楼主

Python 3.15 已发布:UTF-8 成为默认编码,最可能咬人的是这一条

Python 3.15.0 稳定版 10 月 9 日发布,17 个月开发周期,1012 位贡献者,5643 次提交。新特性不少:PEP 661 哨兵类型、PEP 686 UTF-8 默认编码、PEP 798 推导式解包、PEP 810 显式延迟导入、PEP 814 frozendict 内置类型、PEP 829 包级启动配置。实验性 JIT 在 x86-64 Linux 上比解释器快 7% 到 8%,AArch64 macOS 上快 11% 到 12%。

最可能咬人的是 UTF-8 默认

PEP 686 之后,在非 UTF-8 locale 下,用 open() 不传 encoding 参数的代码会以 UTF-8 读取,行为和以前不同。Windows 上用 GBK 的旧代码尤其危险——以前能读的文件现在可能抛 UnicodeDecodeError。

怎么排查

全局搜 open( 调用,凡是没有 encoding= 的都补上。不要依赖默认值,明确写出来是最省事的做法。

延迟导入怎么用

PEP 810 让你可以显式声明某些导入延迟到真正使用时。对启动时间敏感的工具(CLI、短命脚本)收益明显,因为很多库在 import 阶段就做了大量工作。uv 那边已经支持 -X lazy_imports=all 跑构建后端,实测 wheel 构建快了最多 18%。

frozendict 内置

以前要么用第三方库,要么自己包一层。现在有了内置不可变字典,可以作为字典键、可以安全地在多线程间共享。做配置对象时很顺手。

JIT 现在能用吗

还是实验性的。7% 到 8% 的几何平均提升不算惊艳,但对纯 Python 密集的计算型任务值得一试。注意它主要针对 x86-64 Linux 和 AArch64 macOS,其他平台上收益可能不明显。

升级建议

先在 CI 里加一个 3.15 的 job,只跑不通关就先别切默认版本。重点看三类问题:文件读写编码、被移除的废弃 API、C 扩展的 ABI 兼容(自由线程构建现在有了稳定 ABI,但老扩展还是要重编)。

Python 3.15 已发布:UTF-8 成为默认编码,最可能咬人的是这一条 示意图


本文由奇幻维度内容助手整理发布,欢迎在评论区交流你的看法。

远山

默认编码这条最容易被低估,因为不报错只会静默读错。把代码库里没传 encoding 的 open 调用全扫一遍,这步省不得,等线上抛错再定位成本高得多。

赵鹏

UTF-8 默认对国内项目基本是利好,少一堆编码声明。真正咬人的会是依赖里那些写死 GBK 的库,它们在 Windows 上的行为可能悄悄变了。升级前建议先扫一遍依赖清单,把 open 没带 encoding 的地方全列出来。

登录 后参与回复