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的支持,所以我特别好奇是否有更好的方法更适合新项目,你可以从中获得清晰的好处.
谢谢!
根据我的经验,这取决于项目的类型.
如果它是一个库或非常自包含的应用程序,则在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的支持.
根据我的经验,最好不要使用类似的库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上却接近一分钟.
| 归档时间: |
|
| 查看次数: |
3442 次 |
| 最近记录: |