[英]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。
我是不是该...
使用__future导入准备所有代码并在此处进行适当更改,并准备好与2.x和3.x一起使用? 我是否会发现这个问题,除了上游的自然阻力整合这么多的变化?
创建另一个代码分支? 对我来说,这应该是毫无用处的,因为除了我之外,没有人会维持那个分支,这可能是一个巨大的重复工作。
使用我不知道的某些类型的包装器来使用这些库(比如在另一种语言中使用一些中间绑定)并在我的代码中创建粘合剂?
非常感谢!
我建议使用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_function
和unicode_literals
在Python2.6上添加, with_statement
在Python2.5上,其他在Python2.2上
所以,如果你想支持2.6或更高版本,你很好。 如果您仍然需要支持2.5或更差的2.4,那么您将需要另一种方法。
使用from __future__ import unicode_literals
将无法正常工作,因为Python2允许您在没有编码的情况下从字节转换为unicode,而Python3则不然。 此外,调用str
或bytes
有不同的参数。
字符串处理的差异似乎是使程序与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.