繁体   English   中英

社区中在同一代码库中使用python 2.x和3.x的首选方法是什么?

[英]What's the preferred method in the community for having python 2.x and 3.x in the same codebase?

我正在使用Python 3.x开始一个项目,(我对Python很新)并且我可能需要使用说Thrift或任何其他尚未移植到Python 3.x的库。

我不介意花一些(大量)时间将外部库转换为Python 3.x,如果有其他人可以从中受益,但我很好奇是否有任何首选的方式在开源社区交易有这个问题。

我一直在python.org网站和其他一些网站上阅读,但我没有找到任何结论。 我发现的唯一一件事就是鸡蛋和鸡蛋问题。

这是不可能的(除非没有其他选择)我运送我自己修改的库的转储只是为了使它符合3.x。

我是不是该...

  1. 使用__future导入准备所有代码并在此处进行适当更改,并准备好与2.x和3.x一起使用? 我是否会发现这个问题,除了上游的自然阻力整合这么多的变化?

  2. 创建另一个代码分支? 对我来说,这应该是毫无用处的,因为除了我之外,没有人会维持那个分支,这可能是一个巨大的重复工作。

  3. 使用我不知道的某些类型的包装器来使用这些库(比如在另一种语言中使用一些中间绑定)并在我的代码中创建粘合剂?

非常感谢!

我建议使用tox从相同的代码库同时支持Python 2.x和Python 3.x. 查看支持所有版本的Python所有时间使用Tox来自Pycon 2011。

我一直在使用的方法是维护版本2格式的代码,使用2to3转换器,并测试版本3中的输出。如果生成的版本3代码有错误,我使用版本2代码获取更好的转换,直到它工作。 Python wiki对此有一些很好的建议: http//wiki.python.org/moin/Python2orPython3

PEP 3000在维护双版本代码库方面也有一些很好的建议。

当您的库最终准备好3.x时(可能是自己动手),那么您就可以使用3.x代码库了。

我不能为社区说话,但这些from __future__ import ...不适用于所有python版本,或者在某些情况下不可靠。

print_functionunicode_literals在Python2.6上添加, with_statement在Python2.5上,其他在Python2.2上

所以,如果你想支持2.6或更高版本,你很好。 如果您仍然需要支持2.5或更差的2.4,那么您将需要另一种方法。

使用from __future__ import unicode_literals将无法正常工作,因为Python2允许您在没有编码的情况下从字节转换为unicode,而Python3则不然。 此外,调用strbytes有不同的参数。

字符串处理的差异似乎是使程序与Python2和Python3兼容的主要问题。

您可以使用各种策略,哪种最好取决于几个方面,例如您移植的内容,复杂程度以及它使用的Pythons内部有多少。基本上,如果您想同时支持Python 2和Python 3一次,在代码上运行2to3,看看它有多少变化。 如果更改主要是您可以使用__future__导入解决的问题,那么移植到Python 3并重新引入Python 2兼容性可能是一种可行的方法。 (有关此内容的详细信息,请参阅我的迁移策略页面。)

如果更改很重要,那么最好使用2to3来支持Python 3.如果您可以使用Distribute打包项目,这将变得更加容易。

在这两种情况下,您可以使用六个

另见我关于这个主题的演讲

http://docs.python.org/dev/howto/pyporting.html是来自CPython核心开发者的最新建议的来源(尽管听起来你已经看过了)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM