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 的每个版本都会指定兼容性标签(例如,cp39
、py39
用于 CPython 3.9)。对于 CPython 3.10,此 PEP 建议使用 3_10
作为标签的版本部分(而不是 310
)。
动机
到目前为止,例如 wheel 文件名中使用的兼容性标签的版本部分一直是 Python 主版本和次版本号的直接连接,对于 CPython 解释器标签和通用的、与解释器无关的解释器标签(例如,cp39
和 py39
)都是如此。这也适用于 ABI 标签(例如,cp39
)。由于主版本和次版本都是一位数,因此例如 39
中的哪一位表示什么一直很明确。
但从 Python 3.10 开始,出现了歧义,因为 310
并不能清楚地界定 Python 版本是 3.10
、31.0
还是 310
作为 Python 的仅主版本。因此,使用 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
文件、stdlib 的 zip 文件的导入路径)。尚不清楚使这种做法普遍化的用处有多大。
将双位数次要版本号标准化
已经提出了一个替代方案,即通过强制次版本号始终为两位数来消除主版本和次版本号的开始/结束位置的歧义,根据需要用 0
填充。这样做的好处是它使当前的 cp310
解释器标签准确,从而最大程度地减少中断。它也确实区分了未来的发展。
不过,也存在一些缺点。其中之一是消除歧义仅在您知道次版本号为两位数时才存在;将其与 cp3_10
进行比较,无论您的基础知识如何,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
上次修改时间:2023-09-09 17:39:29 GMT