2

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

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

我一直在 python.org 网站和其他一些网站上到处阅读,但我没有找到任何结论性的东西。我唯一发现的是,这是一个先有鸡还是先有蛋的问题。

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

我是不是该...

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

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

  3. 使用某种我不知道的包装器按原样使用这些库(例如使用另一种语言的一些中间绑定)并在我的代码中创建胶水?

非常感谢!

4

5 回答 5

2

我建议使用tox从同一代码库同时支持 Python 2.x 和 Python 3.x。查看Pycon 2011 上的 Tox 始终支持所有版本的 Python演讲。

于 2011-05-16T22:47:30.470 回答
2

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

PEP 3000也有一些关于维护双版本代码库的好建议。

当你的库最终准备好 3.x 时,(也许你自己做)那么你就有了一个 3.x 代码库准备好了。

于 2011-05-16T23:11:04.060 回答
2

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

print_functionunicode_literals在 Python2.6、with_statementPython2.5 和其他 Python2.2 上添加

所以,如果你想支持 2.6 或更高版本,你没问题。如果您仍然需要支持 2.5 或者更糟糕的是 2.4,您将需要另一种方法。

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

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

于 2011-05-16T23:25:56.810 回答
2

您可以使用多种策略,哪种策略最好取决于几件事,例如您要移植的内容、它的复杂程度以及它使用了多少 Python 内部结构。基本上,如果您想同时支持 Python 2 和 Python 3,请访问有一次,在你的代码上运行 2to3,看看它有多少变化。如果更改大多是可以通过__future__导入解决的问题,那么移植到 Python 3 并重新引入 Python 2 兼容性可能是一种可行的前进方式。(要深入了解这一点,请参阅我的迁移策略页面。)

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

在这两种情况下,您都可能使用6 个.

另请参阅我关于该主题的演讲

于 2011-05-17T08:20:08.293 回答
1

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

于 2011-05-17T02:38:33.570 回答