1. FlyPython首页
  2. Python高级话题

为什么你现在还不能切换到 Python 3.10

Python 3.10 现在可用——但你应该立即切换到它吗?如果不是现在,什么时候?

简短的回答是,不,您可能不想立即切换;很可能你不能立即切换。要了解原因,我们需要考虑 Python 打包、软件开发过程,并查看过去版本的历史。

然后我们可以猜测 Python 3.10 何时真正可用。

新的主要 Python 版本的问题

我写这篇文章是在 2021 年 10 月 5 日,也就是 3.10 发布的第二天……现在开始使用 Python 3.10 还为时过早。

与许多开源项目一样,Python、Python 库以及本文中提到的大多数工具链和包都是基于志愿者的劳动。这一切都不应被视为对从事维护工作的人的抱怨,他们正在免费做非常有价值的工作,而且一切都需要时间。此外,由于升级涉及许多不同的群体,协调和发布需要更多时间。

考虑到这一点,让我们考虑一下今天使用 3.10 的问题:

1. 缺少 Docker 镜像

更新:最终的 Docker 3.10 映像现已可用。

让我们尝试在 Docker 下运行 Python 3.10:

$ docker run -it python:3.10
Unable to find image 'python:3.10' locally
docker: Error response from daemon: manifest for python:3.10 not found: manifest unknown: manifest unknown.

事实证明,最终版本没有 Python 3.10 Docker 镜像。如果您想使用 Python 3.10,您可以使用候选版本,例如python:3.10-rc.

毫无疑问,它将在未来几天内推出,甚至可能在今天推出,但即使在早期安装新版本也很困难。这只是我们的第一个问题。

2. 缺少二进制包

另一个问题是并非所有软件包都支持 3.10。例如,psycopg2-binary提供与 PostgreSQL 数据库的绑定;上个月,从 PyPI 获得1700 万次下载当我尝试在 Python 3.10 上安装它时,事情并不顺利:

$ docker run python:3.10-rc-slim pip install psycopg2-binary
...
   Error: pg_config executable not found.
    
    pg_config is required to build psycopg2 from source.
...

这是怎么回事?

通常,Python 包维护者将其包的编译版本(称为“轮子”)上传到 PyPI。当你安装一个包时,你可以只下载二进制轮而不需要编译它(除非你使用的是Alpine Linux)。

但是在 3.10 发布后不久,许多软件包还没有适用于 Python 3.10 的轮子。在这种情况下,psycopg2-binary仍然没有 3.10 的轮子。

公平地说,这方面的情况似乎正在改善:对于 3.9 版本,NumPy 和 Pandas 在发布后不久就没有可用的轮子。这一次,他们做到了。话虽如此,NumPy 包仅限于 Linux,并且主要用于测试目的。截至 2021 年 10 月 12 日,仍不支持 Windows 和 macOS。由于 Pandas 依赖于 NumPy,因此在 NumPy 包发布之前,它也无法在 Windows 或 macOS 上运行。

还有很多其他项目缺少 3.10 轮子;选择另一个随机示例,matplotlib(每月从 PyPI 下载 2700 万次)也缺少 3.10 二进制轮。

重要提示:确保升级 pip,否则您可能无法在 Linux 上获得 3.10 的最新二进制轮子,而是pip会尝试从源代码构建。

3. 不兼容的包

有时这只是重新编译代码的问题。这意味着你可以自己编译它,只要足够的工作,维护者通常会很快发布一个新的轮子。然而,在其他情况下,代码不兼容,需要做一些工作来支持新的 Python 版本。

例如,我已经开始将Fil 内存分析器移植到 3.10,但最初测试失败了。修复了代码中的不兼容性,下一个问题是测试套件依赖于numexpr包,并且numexpr在 NumPy 完成 3.10 轮子之前不会有 3.10 轮子。所以有一个依赖关系树阻止了一个新版本。

鉴于许多 Python 包是由志愿者维护的,他们的空闲时间有限并且独立工作,更新只需要时间来渗透到系统中。

4. 缺乏 Conda 支持

如果您使用的是 Conda,则 Python 3.10 尚不可用。Conda-Forge 已经开始工作,但主要的 Python 包还没有发布 3.10 版本,一旦发布,所有 Python 包都需要为 3.10 更新和重建。

5. Python 中的错误

Python 3.9.0 于 2020 年 10 月发布。3.9.1 于 2 个月后发布,其中包含一长串错误修正

当然,未来总会有另一个错误修复版本,但考虑到主要版本之间有 12 个月的时间间隔,很多新代码将被编写但没有被广泛使用。这意味着带有大量错误修复的后续版本。Python 3.10.1 可能会有许多错误修复作为库,然后应用程序开始切换并遇到更多问题。

6. 缺乏工具链支持

新版本的 Python 通常有新的语法,Python 3.10 就是这种情况:您可以使用结构模式匹配但是,其他工具也需要支持新语法——自动格式化程序、linter 等等。在他们这样做之前,您不能使用新语法。

例如,在我写这篇文章时,black代码格式化程序还不支持模式匹配语法

你应该使用什么版本?

鉴于升级需要一些工作——一些额外的测试,对你的代码进行一些调整——很容易无限期地推迟升级 Python 版本。
当您可以无限期地使用当前版本时,为什么要担心不兼容、新版本等问题?

问题是 Python 不是无限期支持的,库也不是无限期支持所有 Python 版本。因此,如果您在运行 5 年前的 Python 版本,切换将成为一件大事——您通常最终会同时处理 Python 和库中更重要的跨版本更改。这让升级变得可怕。迟早你将不得不升级。

例如,Python 3.6 将在 2021 年 12 月结束安全更新距离我写这篇文章只有两个月的时间。确实,发布它的 Linux 发行版(如 RHEL 8)将继续提供安全更新。但是 RHEL 8 也打包了 Python 3.8 和 3.9;你真的不应该再使用 3.6 了。

与每隔几年发生一次大规模可怕的升级事件不同,拥有连续、持续的较小升级过程要安全得多。
每当出现新的主要 Python 版本或新的主要库版本时,请稍等,然后再切换。

也就是说,目前,如果可以的话,您确实应该使用 3.9。如果您落后太多,请进行一系列升级:3.7、3.8、3.9,最终是 3.10。

什么时候应该切换到 Python 3.10?

至少,您需要等到:

  1. 您所有的库都明确支持新的 Python 版本。
  2. 您依赖的所有工具都明确支持新的 Python 版本。

可能值得等待几个月,直到 2021 年 12 月中旬,然后才能尝试尝试您的应用程序。除了依赖项可用性和工具链支持之外,此时您还可以访问第一个版本 3.10.1。如果仍然缺少依赖项,请每个月再试一次。

原创文章,作者:flypython,如若转载,请注明出处:http://flypython.com/advanced-python/530.html