Python 2和Python 3双重开发

Gus*_*son 29 python python-2to3 python-3.x

我刚刚开始一个新的Python项目,理想情况下我想从一开始就提供Python 2和3支持,只需要很少的开发开销.我的问题是,为全新项目做这件事的最佳方法是什么?

作为安装脚本的一部分,我遇到了运行2to3甚至3to2的项目.这似乎是一种非常常见的方式.但是,似乎有几种不同的方法可以做到这一点.我也遇到了Distribute.

还可以选择编写多语言Python 2/Python 3代码.即使这看起来像一个可怕的想法,我注意到我最近编写的代码更像是Python 3代码,尽管我仍然以Python 2运行它.我有一种感觉这只会帮助我自己的过渡时这一天终于到来了,并没有为提供或至少帮助双重支持做多少.

我提供的大多数提供双重支持的项目都是后期添加了Python 3的支持,所以我特别好奇是否有更好的方法更适合新项目,你可以从中获得清晰的好处.

谢谢!

Bre*_*arn 9

您应该看看六个库,它提供了一个统一的接口,可以处理Python 2和3之间不同的各种事物.


Pau*_*ine 7

根据我的经验,这取决于项目的类型.

如果它是一个库或非常自包含的应用程序,则在Python 2.7中开发一个常见的选择,尽可能避免在Python 3.x中弃用的构造,并采用自动化测试来识别py2to3留下的手动必须手动修复的漏洞.

另一方面,对于现实生活中的应用程序,请准备不断发现尚未移植到py3k的库(有时是重要的库).大多数情况下,您将别无选择,只能将库移植到Python 3,所以如果您能负担得起,那就去吧.通常我不能,这就是为什么我不支持Python 3用于这种项目(但是我很难编写在适当的时候更容易移植的代码).

对于unicode处理,我发现这个PyCon 2012视频非常有用.这个建议适用于Python 2.x和3.x:将来自外部的每个字符串视为字节并尽快转换为unicode,并尽可能晚地输出字符串转换为字节.还有另一个关于日期/时间处理的非常丰富的视频.

[更新]

这是一个古老的答案.截至今天(2019年),使用Python 2.x启动项目并没有很好的理由,并且有几个令人信服的理由将旧项目移植到Python 3.7+并放弃对Python 2.x的支持.


Ant*_*ala 5

根据我的经验,最好不要使用类似的库six ; 相反,我compat.py只需要一个包含所需代码的每个包,就像Scott Griffiths的方法一样.six还有尝试支持已经过时的Python版本的负担:事实上,当你接受Pythons <= 2.6和<= 3.2消失时,生活会更容易.在2.7中,有一些向后移植的兼容性功能,例如s .view*dict的方法,与Python 3上的非前缀版本完全相同; 另一方面,Python 3.3 u再次支持unicode字符串的前缀.

即使对于非常实质的软件包,一个compat.py允许其他代码不变的模块也可以很短:pika是我和我的同事帮助制作2/3多语言软件包的一个例子.Pika是那些真正搞混合unicode和8位字符串的内部组件的项目之一,但现在我们已经在Python 3的生产中使用它超过6个月没有问题.


其他重要的是__future__在开发时始终使用以下s:

from __future__ import absolute_import, division, print_function
Run Code Online (Sandbox Code Playgroud)

我建议不要使用unicode_literals,因为有些字符串需要是str在任一平台上调用的类型.如果您不使用 unicode_literals,您可以执行以下操作:

  • b'123' 是8位字符串文字
  • '123'str两种平台上的类型
  • u'123' 是两个平台上正确的unicode文本

无论如何,请不要在安装/包装构建时 2to3; 过去曾经使用过的一些软件包 - pip install这些软件包在Python 2上耗费了几秒钟,但在Python 3上却接近一分钟.


Yus*_*f X 2

选择 2 或 3 种,看哪一种是你最喜欢的,并通过单元测试让它在其中运行得很好。然后确保这些测试在通过 py2to3 或 py3to2 运行后有效。最好维护一个版本的代码。