为什么 Python 4.0 不会像 Python 3.0

还没有读者喜欢这篇文章。
code.org keynote address

Opensource.com

python-ideas 的新来者偶尔会提到 “Python 4000” 的想法,在提出不向后兼容的更改时,这些更改没有提供从当前合法的 Python 3 代码的清晰迁移路径。 毕竟,我们允许 Python 3.0 进行这种更改,那么为什么我们不允许 Python 4.0 进行这种更改呢?

我已经听过很多次这个问题了(包括更担忧的措辞 “你已经进行过一次重大的不向后兼容的破坏,我怎么知道你不会再做一次呢?”),我想我应该在这里记录我的答案,以便将来能够引导人们回来参考。

目前对 Python 4.0 有什么期望?

我目前的期望是,Python 4.0 只不过是 “Python 3.9 之后的版本”。 就是这样。 没有对语言的深刻更改,没有重大的不向后兼容的破坏 - 从 Python 3.9 到 4.0 应该像从 Python 3.3 到 3.4(或从 2.6 到 2.7)一样顺利。 我甚至期望稳定的应用程序二进制接口(最初在 PEP 384 中定义)在边界上保持不变。

按照目前的语言特性发布速度(大约每 18 个月一次),这意味着我们可能会在 2023 年的某个时候看到 Python 4.0,而不是看到 Python 3.10。

那么 Python 将如何继续发展?

首先,Python 增强提案流程没有任何改变 - 向后兼容的更改仍然经常被提出,新的模块(如 asyncio)和语言特性(如 yield from)被添加以增强 Python 应用程序可用的功能。 随着时间的推移,Python 3 将继续在默认提供的功能方面超越 Python 2,即使 Python 2 用户可以通过第三方模块或 Python 3 的反向移植来访问等效的功能。

竞争的解释器实现和扩展也将继续探索增强 Python 的不同方法,包括 PyPy 对 JIT 编译器生成和软件事务内存的探索,以及科学和数据分析社区对数组导向编程的探索,该编程充分利用了现代 CPU 和 GPU 提供的向量化功能。 与其他虚拟机运行时(如 JVM 和 CLR)的集成也有望随着时间的推移而得到改善,特别是因为 Python 在教育领域取得的进展可能会使其作为嵌入式脚本语言在这些环境中运行的更大应用程序中越来越受欢迎。

对于不向后兼容的更改,PEP 387 提供了一个对 Python 2 系列多年来使用的方法的合理概述,并且今天仍然适用:如果某个功能被认为过于有问题,那么它可能会被弃用并最终删除。

但是,对开发和发布过程进行了一些其他更改,使得 Python 3 系列中不太可能需要此类弃用。

  • 更加强调 Python 包索引,如 CPython 核心开发团队和 Python Packaging Authority 之间的合作所示,以及将 pip 安装程序与 Python 3.4+ 捆绑在一起,减少了在模块足够稳定以适应相对较慢的语言更新周期之前将其添加到标准库的压力。
  • “临时 API” 概念(在 PEP 411 中引入)使得可以对库和 API 应用 “稳定期”,这些库和 API 被认为可能从更广泛的反馈中受益,然后提供标准向后兼容性保证。
  • 在 Python 3 过渡中确实清理了很多积累的遗留行为,并且现在对 Python 和标准库的新增内容的要求比 Python 1.x 和 Python 2.x 时代严格得多
  • “单源” Python 2/3 库和框架的广泛开发强烈鼓励在 Python 3 中使用 “记录的弃用”,即使这些功能已被更新的、首选的替代方案所取代。 在这些情况下,弃用通知会放在文档中,建议新代码首选的方法,但不会添加任何程序化的弃用警告。 这允许现有代码(包括支持 Python 2 和 Python 3 的代码)保持不变(以新用户在负责维护现有代码库时可能需要学习更多内容为代价)。

从(主要是)英语到所有书面语言

还值得注意的是,Python 3 并没有像它最终变成的那样具有破坏性。 在 Python 3 中所有不向后兼容的更改中,许多迁移的严重障碍都可以归咎于 PEP 3100 中的一个小小的要点:

  • 使所有字符串都成为 Unicode,并拥有一个单独的 bytes() 类型。 新的字符串类型将被称为 ‘str’。

PEP 3100 是 Python 3 更改的所在地,这些更改被认为足够没有争议,以至于不需要单独的 PEP。 此特定更改被认为没有争议的原因是因为我们使用 Python 2 的经验表明,Web 和 GUI 框架的作者是正确的:作为应用程序开发人员合理地处理 Unicode 意味着确保所有文本数据都尽可能接近系统边界地从二进制转换为文本,然后作为文本进行操作,然后转换回二进制以用于输出目的。

不幸的是,Python 2 并没有鼓励开发人员以这种方式编写程序 - 它广泛地模糊了二进制数据和文本之间的界限,使得开发人员很难在他们的头脑中将两者分开,更不用说在他们的代码中了。 因此,Web 和 GUI 框架的作者必须告诉他们的 Python 2 用户 “始终使用 Unicode 文本。 如果你不这样做,你在处理 Unicode 输入时可能会遇到晦涩难懂且难以追踪的错误”。

Python 3 是不同的:它在 “二进制域” 和 “文本域” 之间施加了更大的分离,使得编写正常的应用程序代码更容易,同时使得编写处理系统边界的代码更困难,在系统边界中,二进制数据和文本数据之间的区别可能不太清楚。 我在 其他地方 更详细地写了关于 Python 2 和 Python 3 之间文本模型中实际发生的变化。

Python 的 Unicode 支持的这场革命正在进行中,它发生在更大的计算文本操作迁移的背景下,从仅英语的 ASCII(正式定义于 1963 年),通过 “二进制数据 + 编码声明” 模型的复杂性(包括在 20 世纪 80 年代后期引入的 C/POSIX 语言环境Windows 代码页 系统)和 Unicode 标准 的初始 16 位版本(于 1991 年发布),到相对全面的现代 Unicode 代码点系统(首次定义于 1996 年,每隔几年发布新的主要更新)。

为什么要提到这一点? 因为这种切换到 “默认使用 Unicode” 是 Python 3 中最具破坏性的不向后兼容的更改,并且与其他更改(它们更特定于语言)不同,它是整个行业范围内在如何表示和操作文本数据方面进行更大范围更改的一小部分。 随着 Python 3 过渡清除了特定于语言的问题,与 Python 的早期相比,新语言特性的入门门槛更高,并且目前没有其他行业范围内的迁移(规模与从 “带有编码的二进制数据” 切换到 Unicode 以进行文本建模一样),我看不到任何需要 Python 3 风格的不向后兼容的破坏和平行支持期的更改。 相反,我希望我们能够在正常的变更管理流程中适应任何未来的语言发展,并且任何无法以这种方式处理的提案都将被拒绝,因为它会对社区和核心开发团队造成不可接受的高成本。

最初发布在 Curious Efficiency 上,也可在 Red Hat 开发者博客 上找到。 在 Creative Commons 许可下重新发布。 有关 Python 演变的更多信息,你可能对 使用 Python 过渡到多语言编程 感兴趣,它也是由 Nick Coghlan 撰写的。

标签
User profile image.
Nick 是 CPython 核心开发人员和 Python 软件基金会董事会成员。

13 条评论

“我目前期望 Python 4.0 只不过是 'Python 3.9 之后的版本'”

这不是小数点.. 3.9 之后是 3.10。

是的,但是 Nick 是 Python 的核心开发人员之一,所以如果他们说 “Python 3.9 之后是 4.0”,那么就是 4.0 :)

回复 WorMzy (未验证)

...而这就是使 Python 3 成为自 Perl 6 以来采用率最差的语言更新之一的态度。 为什么不把 python 3 的所有好特性都集成到 python 2.7 中并称之为 Python 4(或 python 2.8)。 然后绝大多数代码库都可以兼容最新的 python 版本以及所有最新的特性,我们可以假装 Py3K 从未发生过。

回复 Ricardo J. Barberis (未验证)

抱歉,但只有不知情的人才会这么说。“为什么不...” - 说真的,你是软件开发人员吗? :/ 如果他们这样做,Python 就不会像现在这样整洁,它会是一堆垃圾,字面意思。

回复 dhj (未验证)

天哪,这是一个可怕的语义版本控制违规。 我希望他是在开玩笑。

如果 python 意味着永远不会进行不向后兼容的更改,那么就不应该有 python 4.0。

回复 Ricardo J. Barberis (未验证)

“嵌入式脚本语言”

抱歉,Lua 已经占据了该市场。 Python 绝对没有机会,因为 VM 臃肿且非常不适合嵌入。

这就是我认为 Python 4 应该彻底重写解释器的原因。 拥抱 Python 在数值计算中的广泛使用,并将其用途扩展到游戏开发等领域。 从 pypy 和 cython 中汲取灵感。 两者都可以集成到核心中,但从头开始可能更容易。

回复 ,作者 Clive (未验证)

Lua 是一种嵌入式脚本语言,它不能独立运行。

回复 ,作者 Clive (未验证)

很抱歉回复晚了,但你是对的,目前以 CPython 的形式嵌入它存在一些严重的技术障碍。 如果人们认为最终结果足够有价值(例如 Blender),他们就会做这项工作,但它既复杂又挑剔,以至于它不会成为人们的首选,尤其是在主要重点是编写嵌入应用程序的组件脚本,并且您不想要或不需要访问诸如科学 Python 计算堆栈之类的东西来进行矩阵操作和机器学习算法时。

PEP 432 (https://pythonlang.cn/dev/peps/pep-0432/) 是一个目前尚未获得资金支持的提案,旨在通过重新设计 CPython 运行时的配置方式来改变这种状况。 现在我们已经到了 3.5 开发周期的后期,今年不太可能实现,所以我可能会在 Python 3.6 的时间框架内再次考虑推进它。

随着数字教育政策的变化开始产生影响,并且我们开始看到高中生(至少在澳大利亚和英国,但也可能在其他地区)毕业时就已经接触过 Python 作为他们文本编程语言的入门,这个领域可能会变得更有趣。

回复 ,作者 Clive (未验证)

如果 Python 4 想要保持其地位,它应该成为 Java 和 C# 的杀手。 我们目前看到 Python 的情况是,它一直在跳跃于临时版本之间,例如 Linux 用户群甚至还没有接受 3.0。 如果它想成为山丘之王,它需要倾听其用户群的意见。

没错。 在 Linux 方面,我们中的许多人一直在与 Linux 供应商和像 OpenStack 这样的主要项目合作解决他们的移植问题,并在最合理的地方解决这些问题(无论是向 pylint 添加“--py3k”模式,努力使 Ubuntu 和 Fedora 使用 Python 3 作为主要的系统 Python,还是推动像使 C.UTF-8 区域设置为上游 glibc 的标准功能这样的更改)。 (Red Hat 和 Canonical 实际上都雇佣了许多 CPython 核心开发人员,其他主要的 Linux Python 用户,如 HP、Google 和 Rackspace 也是如此)

随着各种移植的技术障碍被确定,我们要么寻找增强 Python 3 本身的方法来解决这些问题(例如恢复对二进制转换编解码器的完全支持和恢复二进制插值支持),要么研究如何使像 six、modernize 和 future 这样的移植工具更容易访问(这是 pip 包安装程序现在默认随 Python 2 和 Python 3 一起发布的关键原因)。

在用户方面,中小学教育部门基本上已经转向 Python 3,并且在 Python 3.5 中包含专用的矩阵乘法运算是为了响应分析 Python 社区的反馈(和贡献)。

除了可能对矩阵乘法运算符感兴趣,以便更清晰地表达矩阵和向量运算之外,对于像 AutoDesk 这样的组织来说,目前还没有一个非常好的 Python 3 诱惑(这很可能是那些不使用 Blender 的 3D 动画社区的引爆点),但正如我在对 Clive 的回复中提到的,我想在某个时候解决当前嵌入的复杂性,这对于目前需要求助于复杂技巧才能使 Python 2 按照他们想要的方式运行的任何人来说都很有吸引力。

至于挑战 JVM 和 CLR,我同意这是一个非常有趣的领域,而且我实际上相信 PyPy 社区最有能力做到这一点。 PyPy 不仅体现了一种设计 JIT 编译器的创新方法,而且 Armin Rigo 对软件事务内存实际应用的研究确实具有突破性,并且提供了一个现实的前景,即能够在事件驱动模型中对 PyPy 托管的应用程序进行编程,同时仍然利用所有可用的核心,并且如果您碰巧从事件处理程序进行阻塞调用,也不会停止整个应用程序。

回复 ,作者 Zed (未验证)

Python 所做的一切都很棒,我同意你所说的。 我希望很快,Ubuntu、Red Hat 等能够接受 Python 3 作为标准的 Python 版本,因为它一直在稳步超越 Python 2.7 的功能集。

我也对 PyPy 社区在这么多方面所做的事情着迷。 我可以看到,在未来的某个时候,PyPy 可以让为不同后端(CPython、Jython、IronPython)拥有多个 Python 版本成为过去。 如果他们可以像 Jython/IronPython 那样获得 Jython 和 IronPython 与 JVM/CLR API 的集成,并且如果他们可以获得与 CPython 代码最接近的兼容性(而不牺牲他们在各个方面所做的出色工作),以及与 C/C++ 扩展的良好集成,我可以看到它成为标准的 Python 实现。 然而,他们离所有这些还有一段路要走。

Python 在科学/中等教育领域的推广也令人震惊。 我的一位老朋友在他的博士工作期间一直在使用 Python(在我的劝说下,并意识到它比 Matlab 和其他工具更便宜/更丰富),并让他的研究实验室采用它作为他们物理研究的事实标准。

回复 ,作者 ncoghlan

Python 用于算法和脚本之类的东西,Java/C# 用于二进制开发和独立应用程序,而 Lua 用于嵌入到 Java/C# 应用程序中。 而 C++ 几乎可以用于所有事情。 那么 Python 为什么要嵌入(除了 GIMP 中的 PythonFu 已经做到了)?

知识共享许可协议本作品以 CC0 1.0 通用版 (CC0 1.0) 公共领域贡献声明协议授权
© . All rights reserved.