
Python 3.15发布,Python 3.10正式停止支持
来源标题:Migrating to Python 3.15
Python 3.15 发布后,Python 3.10 正式进入生命周期终点,不再获得更新;Python 3.13 则进入仅安全更新阶段。这意味着维护旧版本兼容的项目可将最低支持版本提高到 3.11,从而使用 3.11 引入的不向后兼容特性。
以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。
如果愿意,你也可以查看即将发布的邮件的日程安排。
当一个新 Python 版本发布、你考虑采用它时,需要结合你的项目,考虑三组互不重叠的特性。
前两组分别是:与其他 Python 版本向后兼容的新特性集合,以及不向后兼容的特性集合。
要理解相关的第三组特性,请看下面这张来自 python.org 的截图:
随着 Python 3.15 的发布,Python 3.10 正式进入生命周期终止(end-of-life)阶段,3.13 则进入仅安全更新(security-only)阶段。
这意味着 Python 3.10 不会再更新,Python 3.13 也不会再改进,只会接收安全更新。
如果你手上的项目需要兼容较旧的 Python 版本,那么 3.10 的生命周期终止意味着你可以主张只需支持 3.11 及更新版本。¹
如果一个项目从支持 Python 3.10+ 转为支持 3.11+,就意味着该项目现在可以自由使用 3.11 引入的那些不向后兼容的特性。
这就是要考虑的第三组特性。
Python 3.15 引入了许多令人兴奋的新特性,而且即使你打算支持 Python 3.11+ 或 3.13+,也有很多特性现在就能开始使用。
Python 3.15 的惰性导入(lazy imports)引入了新语法,这自然意味着它不向后兼容。
不过,显式惰性导入也提供了一种向后兼容的机制,通过全局列表 __lazy_modules__ 实现:
import math
__lazy_modules__ = ["math", "json"]
from json import dump, load
import pathlib
在 Python 3.15+ 中,模块 json 的导入是惰性完成的,因为它出现在 __lazy_modules__ 这个惰性加载模块列表之后。
在更早的 Python 版本中,__lazy_modules__ 只是一个普通的 Python 列表,如果你不用它做任何事,这个列表就会被忽略,所有导入都是立即执行的。
Python 3.15 在类型标注(typing)方面也有一些重大变化,包括为 TypedDict 增加了新行为。
大多数情况下,类型提示只在静态类型检查时使用,因此总有办法在较旧的 Python 版本中使用新的类型特性。
在支持较旧 Python 版本的项目中使用新类型特性,最常见的方式是通过 typing_extensions 模块。
当无法使用 typing_extensions 时,你也可以把类型提示写成字符串。
只要你的静态类型检查器使用的是最新的 Python 版本,一切都没问题。
Python 3.15 引入了一个名为 Tachyon 的新采样分析器(sampling profiler)。虽然 Tachyon 只能用于分析运行在与 Tachyon 自身相同 Python 版本上的程序,但这并不意味着支持 3.11+ 的项目就不能利用 Tachyon。
在实践中,对于脚本和其他从头运行到尾的程序,你可以直接尝试用 Tachyon 运行它们。
如果你不得不用其他 Python 版本运行代码,那么从 Tachyon 得到的分析信息只是真实数字的近似值,但它仍能帮你洞察瓶颈所在。
如果你的项目提供长时间运行的组件,比如 Web 服务器,你也可以尝试直接用 Python 3.15+ 运行它们,然后用 Tachyon 附加到正在运行的进程上。
如果你的项目发布 C 扩展,你可以开始使用新的 abi3t 了。
abi3t 引入了一套新的受限 C API,它与 free-threaded 构建兼容;使用它意味着,随着新 Python 版本的发布,你可以把 free-threaded 兼容的 wheel 数量保持在最低限度。
新增的内置 frozendict 不向后兼容,但有一件事你应该开始着手做,以改善对 frozendict 以及 Python 3.15+ 用户的支持。
如果你的项目也支持 3.15+,那么对于操作类字典对象的函数,请开始默认使用 collections.abc.Mapping 作为类型提示;当类字典对象必须是可变的时候,使用 collections.abc.MutableMapping。
即使你的项目还支持较旧的 Python 版本,也应该这样做。
这是因为 dict 和 frozendict 的类层次结构互不相关,所以一个期望接收 dict 的函数无法用 frozendict 调用,尽管在很多地方这样做本应没问题。
Python 3.15 引入了大量不向后兼容的特性:
上面这份列表远非详尽,但涵盖了 Python 3.15 中最引人注目的不向后兼容更新。
如果你正在把项目迁移到 3.15+,请过一遍上面的列表,熟悉一下你可以使用的新特性。
然后,通读你的代码,寻找使用这些新特性的机会。
如果你的代码提供任何可运行的入口点,比如 CLI 或 Web 服务器,考虑默认使用惰性导入。
惰性导入几乎可以免费加快启动时间。
在考虑 dict 与 frozendict 这一对时,请遵循以下规则:
默认使用 frozendict;使用 dict 意味着你在明确表示这个字典需要被修改。
正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。