为什么 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)一样顺利。 我甚至期望稳定的应用程序二进制接口(Application Binary Interface,如 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 系列中不太可能需要这种弃用

  • 正如 CPython 核心开发团队与 Python Packaging Authority 之间的合作以及将 pip 安装程序与 Python 3.4+ 捆绑在一起所表明的那样,更加强调 Python Package Index 减少了在模块足够稳定以适应相对较慢的语言更新周期之前将其添加到标准库的压力
  • “临时 API”概念(在 PEP 411 中引入)使得可以在提供标准向后兼容性保证之前,将“稳定”期应用于被认为可能受益于更广泛反馈的库和 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 年),到“二进制数据 + 编码声明”模型的复杂性(包括 C/POSIX 区域设置Windows 代码页 系统,这些系统是在 1980 年代后期引入的),以及 Unicode 标准 的初始 16 位版本(于 1991 年发布)到相对全面的现代 Unicode 代码点系统(于 1996 年首次定义,每隔几年发布新的重大更新)。

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

最初发布在 Curious Efficiency 上,也可在 红帽开发者博客 上找到。 在 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 绝对没有机会,因为它的虚拟机很臃肿,非常不适合嵌入。

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

回复 ,作者:Clive (未验证)

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

回复 ,作者:Clive (未验证)

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

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

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

回复 ,作者:Clive (未验证)

如果Python想保持其称号,Python 4应该成为Java和C#的杀手。 我们目前在Python中看到的是它不断在过渡版本之间跳跃,例如Linux用户群甚至还没有接受3.0。 如果它想成为山丘之王,就需要倾听其用户群的声音。

完全正确。 在Linux方面,我们中的一些人一直在与Linux供应商和像OpenStack这样的主要项目合作,解决他们的移植问题,并在最有意义的地方解决这些问题(无论是向pylint添加“--py3k”模式,努力使Ubuntu和Fedora使用Python 3作为主要的系统Python,还是推动像使C.UTF-8语言环境成为上游glibc的标准功能这样的更改)。(红帽和Canonical实际上都雇佣了许多CPython核心开发者,像HP、Google和Rackspace这样的其他主要的Python-on-Linux消费者也是如此)

随着各种移植的技术障碍被识别出来,我们要么寻找增强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.