PEP 641 – 在 Python 3.10 兼容标签的版本部分使用下划线
- 作者:
- Brett Cannon <brett at python.org>, Steve Dower <steve.dower at python.org>, Barry Warsaw <barry at python.org>
- PEP 代理人:
- Pablo Galindo <pablogsal at python.org>
- 讨论至:
- Discourse 帖子
- 状态:
- 已拒绝
- 类型:
- 标准跟踪
- 创建日期:
- 2020年10月20日
- Python 版本:
- 3.10
- 发布历史:
- 2020年10月21日
- 决议:
- Discourse 消息
摘要
注意
此 PEP 被拒绝,因为它可能在社区中造成破坏。
使用 PEP 425 中概述的标签系统(主要用于 wheel 文件名),Python 的每个发行版都会指定兼容标签(例如,CPython 3.9 的 cp39、py39)。对于 CPython 3.10,此 PEP 提议使用 3_10 作为标签的版本部分(而不是 310)。
动机
到目前为止,兼容标签的版本部分(例如,在 wheel 文件名中使用)一直是 Python 主版本号和次版本号的直接连接,包括 CPython 解释器标签和通用的、与解释器无关的解释器标签(例如,分别是 cp39 和 py39)。这同样适用于 ABI 标签(例如 cp39)。由于主版本号和次版本号都是个位数,因此例如 39 中哪个数字代表什么一直都很清楚。
但是从 Python 3.10 开始,会出现歧义,因为 310 无法清晰地区分 Python 版本是 3.10、31.0,还是 Python 的仅主版本号 310。因此,使用 3_10 来分隔主版本/次版本部分(如 PEP 425 所允许的)可以区分所支持的 Python 版本。
基本原理
使用 3_10 而不是其他提议的分隔符是 PEP 425 的限制,因此唯一的选择是 3_10 或 310。
规范
将相应地更新 SOABI 配置文件变量和 sysconfig.get_config_var('py_version_nodot') 以使用 3_10。
向后兼容性
依赖于“packaging”项目 [2] 的工具已经期望 Python 3.10 的版本规范为 3_10。如果将版本说明符保留为 310,则需要撤销该更改并更新依赖项目(例如 pip)。
切换到 3_10 将会影响任何隐式依赖次版本号为个位数这一约定的工具。然而,无论此处是否进行任何更改,这些工具都已损坏。
对于假设主版本号只有第一位数的工具,如果切换到 3_10,它们将需要更新。
在非本地化 ASCII 字符集中,_ 会排在任何数字之后,因此会保留字母顺序排序与 wheel 文件名按 Python 版本排序相匹配。
自 PEP 515(Python 3.6)以来,数字字面量中的下划线已被忽略。这意味着 int("3_10") 和 int("310") 会产生相同的结果,并且基于转换为整数的排序将得以保留。**但是**,这仍然是一种糟糕的排序标签的方式,此处提出这一点只是为了表明此提案并不会使情况变得更糟。
安全隐患
没有已知的安全问题。
如何教授此内容
由于解释器标签的使用主要基于机器,并且此 PEP 进行了区分,因此不需要特别的教学考虑。
参考实现
已经存在一个拉取请求 [1] 为 CPython 3.10 添加了支持。支持读取此提议 PEP 的 wheel 文件已实现。
被拒绝的想法
不进行更改
曾考虑过不更改标签并保留 310。论点是这样工作量更少,并且不会破坏任何现有工具。但最终认为区分更好。
未解决的问题
这项提议应该走多远?
主版本号和次版本号使用的其他地方也可以更新为使用下划线(例如 .pyc 文件,以及标准库 zip 文件的导入路径)。目前尚不清楚使这种做法普及有多大用处。
标准化两位数的次要版本号
已提出一项替代建议,通过强制次版本号始终为两位数来区分主版本号和次版本号的开始/结束,并在需要时用 0 填充。这样做的优点是使当前 cp310 解释器标签准确,从而最大程度地减少破坏。它还可以区分未来。
但是,也有一些缺点。一是在区分只存在于**你**知道次版本号是两位数的情况下;与 cp3_10 相比,后者无论你了解多少基础知识都是明确的。这种两位数要求也未能解决出现三位次版本号的可能性。
此外,还存在其他解释器过去、现在或将来不遵循此做法的问题。例如,不知道是否有其他人之前曾为另一个解释器使用过三位数的解释器标签版本部分,而该规则在此情况下将不正确。此更改还将建议具有一位次版本号的解释器(例如 PyPy 7.3)从 pp73 更改为 pp703,或者从下一个次版本发布(例如 7.4 或 8.0)开始进行更改。否则,这将使此规则仅限于 cp 解释器类型,这会使人们感到更加困惑。
参考资料
版权
本文档置于公共领域或 CC0-1.0-Universal 许可证下,以更宽松者为准。
来源:https://github.com/python/peps/blob/main/peps/pep-0641.rst