你打算如何处理迁移到Python 3?

52 投票
7 回答
10387 浏览
提问于 2025-04-11 09:24

我相信这个话题是大多数Python开发者都在关注的,因为Python 3快要发布了。下面是一些可以帮助我们朝着正确方向思考的问题:

  1. 你会同时维护Python 2和Python 3的版本,还是等Python 3完成后就只维护Python 3的版本?

    • 你已经开始了,或者计划很快开始吗?还是打算等到最终版本发布后再全面投入?

7 个回答

5

2.6的主要想法是为升级到3.0提供一个过渡方案。也就是说,你可以通过使用from __future__ import X,慢慢地一次迁移一个功能,直到所有功能都搞定,然后再升级到3.0。很多3.0的新功能也会逐渐出现在2.6中,这样你就可以一点点缩小语言之间的差距,而不是一次性全部迁移。

在我们公司,我们计划先从2.5升级到2.6。然后,我们会开始慢慢启用3.0的新功能,每次一个模块。到某个时候,系统的某个子部分可能就准备好升级到3.x了。

唯一的问题是库。如果某个库从来没有升级过,我们就只能继续使用旧的库。不过我相信,随着时间的推移,我们会找到不错的替代方案来解决这个问题。

8

Django项目使用了一个叫做 six 的库,这个库的作用是让代码可以同时在Python 2和Python 3上运行(博客文章)。

six 通过提供一个兼容层来实现这一点,这个兼容层会聪明地把需要用到的模块和函数导向正确的位置,同时也统一了一些不兼容的变化。

明显的好处:

  • 不需要为Python 2和Python 3分别维护不同的代码分支
  • 不需要使用像2to3这样的转换工具。
90

这是关于Twisted的总体计划。我本来打算写博客分享这些内容,但后来想,为什么不直接做点事情来获取一些积分呢?

  1. 等到有人真正需要。

    现在,没有人使用Python 3。在至少有一个实际用户站出来说“我需要Python 3.0支持”并且有个好理由之前,我们不会花太多精力去做这件事,单纯因为3.0看起来很炫而不够。

  2. 等到我们的依赖库都迁移完成。

    像Twisted这样的大系统有很多依赖库。首先,我们的依赖包括:

    这些项目中有些也有自己的依赖库,所以我们还得等它们。

  3. 等到有人愿意帮忙

    目前,愿意为Twisted工作的人大约有5个——我说“愿意”是因为这其中包括我,而我已经好几个月没贡献代码了。现在我们有超过1000个未解决的问题,在我们花时间把它迁移到一个全新的语言版本之前,能先解决一些这些问题——修复bug、添加新功能,让Twisted本身变得更好——那就太好了。

    这可能还包括赞助商愿意为我们提供资金,但我希望会有更多志愿者关心3.0的支持,并愿意帮助推动社区向前发展。

  4. 遵循Guido的建议。

    这意味着我们不会不兼容地改变我们的API,并且我们会遵循Guido去年发布的过渡开发指南。这首先要有单元测试,并运行2to3转换工具来处理Twisted的代码。

  5. 对2to3工具报告bug,并提交补丁。

    当我们真正开始使用这个工具时,我预计会遇到很多问题。现在在Twisted上运行2to3需要非常长的时间,并且(我上次检查时,已经很久了)无法解析Twisted库中的一些文件,所以生成的输出无法导入。我认为在小项目中会有很多成功案例,以及对这个工具的反复测试,才能让它真正适用于我们。

    不过,Python开发团队在回应我们的bug报告时非常乐于助人,早期对这些问题的反馈也很积极,所以我期待这些问题会及时得到解决。

  6. 在几年内保持2.x的兼容性。

    现在,Twisted支持Python 2.3到2.5。目前,我们正在进行2.6的支持(显然我们必须在3.0之前完成这个!)。我们的计划是根据Ubuntu的长期支持版本来修订我们支持的Python版本——发布的8.04版本包含Python 2.5,将支持到2013年。根据Guido的建议,我们需要放弃对2.5的支持才能支持3.0,但我希望我们能找到解决办法(我们在版本兼容性方面很有创意)。

    所以,我们计划至少支持Python 2.5到2013年。在两年后,Ubuntu将发布另一个长期支持版本:如果它们仍然存在并按计划进行,那将是10.04。个人猜测这将会以Python 2.x,可能是Python 2.8作为/usr/bin/python发布,因为有大量的Python软件与这个发行版捆绑在一起,更新这些软件需要很长时间。所以,从那时起,在2015年,我们可以开始考虑放弃对2.x的支持。

    在此期间,我们将继续遵循Guido关于迁移的建议:在我们的2.x代码库上运行2to3,并修改2.x代码库以确保在两个版本中都能通过测试。

    这意味着,Python 3.x在我35岁生日之后很久才会成为Twisted的语言——它将是我Python 2.x代码的目标运行环境(以及一套指导方针和限制)。我预计在接下来的十年左右,我仍会用Python 2.x编写程序。

所以,这就是计划。我希望在一年左右的时间里,这个计划看起来会显得非常保守;3.x的过渡会轻松得像吃蛋糕一样,大家都会迅速升级。当然,也可能会发生其他事情:2.x和3.x的分支可能会合并,或者有人可能会写一个3to2工具,或者另一个运行时(比如PyPy)可能允许在同一个进程中直接运行2.x和3.x的代码,从而简化我们的转换过程。

但目前,我们假设在很多年里,会有一些人维护着庞大的代码库(或者写新代码的人希望使用尚未迁移的其他库),他们仍然希望在Twisted中获得新功能和bug修复。我预计很快我们也会有一些前沿用户希望在Python 3上使用Twisted。我希望能为所有这些人提供尽可能好的体验。

撰写回答