实验性 Python 3 支持

作者:Aymeric Augustin 发布于 2012年8月19日

一点历史

五月份,Vinay Sajip 发布了一个分支,证明使用单个代码库支持 Python 2 和 3 以及通过整个测试套件是可能的。此分支建立在 Martin von Löwis 之前的努力之上。

不久之后,核心团队决定使用 six 作为兼容性层,而不是临时库。目标不仅是满足 Django 的需求,而且是选择一个适用于整个生态系统的解决方案。从 Django 1.5 开始,six将捆绑为django.utils.six,因此可用于所有使用与 Django 本身相同的移植策略的 Django 应用程序。

迈向 Python 3 支持的第一步实际上是删除uUnicode 字符串的前缀并添加unicode_literalsfuture 导入。此更改是在七月份的 DjangoCon Europe 冲刺中提交的。

然后,大部分工作发生在过去几周,数百次提交更新了 Django 的各个部分。

核心团队专注于编写具有 Python 2 兼容性的 Python 3 代码,而不是相反,以使代码库面向未来。为了避免混淆,名称中包含stringunicode的函数和类被重命名为bytestext分别。因此,移植比 Vinay Sajip 的概念证明具有更大的侵入性。

从好的方面来说,由于字符串编码和解码操作需要在 Python 3 下正确,因此在移植过程中更正了一些近似值。即使兼容性代码增加了一些噪音,但生成的代码在许多地方都更简洁。

我要感谢所有为这个大型项目做出贡献的社区成员和核心开发人员。

接下来是什么?

这是否意味着 Django 已经准备好与 Python 3 一起使用?还没有!

首先,Django 在 Python 3 下几乎没有进行过实际测试。请将代码视为预发布版本。

其次,虽然核心团队尽最大努力消除错误,但测试套件并不涵盖 Django 的所有可能用法。这就是社区发挥作用的地方。

我们需要您的帮助来测试 Django 的开发版本,不仅要 报告 Python 3 上的错误,还要报告 Python 2 上的回归。虽然 Django 在向后兼容性方面非常保守,但错误总是可能发生的,并且大量重构工作很可能引入了一些回归。

最后,Django 远不止是一个 Web 框架——它是一个可插拔应用程序的生态系统。目前,很少有第三方应用程序支持 Python 3。强烈鼓励作者尽快移植他们的可插拔应用程序。移植技巧可在 文档 中找到。

返回顶部