可以从__future__导入...保证Python 2和3的兼容性吗?

Tob*_*ler 12 python python-2.x python-3.x

我对升级"Python 2还是Python 3?"不感兴趣.问题(即使我发现的最近一个是超过一年),但我偶然发现了这个说法:

如果您的文件以该行开头,您可以在Python 2下编写Python 3代码:

from __future__ import absolute_import, division, generators, unicode_literals, print_function, nested_scopes, with_statement
Run Code Online (Sandbox Code Playgroud)

有了这一行,您的代码将适用于Python 2或Python 3.可能有少数情况下它不起作用,但我没有找到任何,

这是真的?这条单行是否足以确保您编写的代码将在Python 2.x(> = 2.5我假设)和3.x(假设导入的模块都可用)中运行?

kin*_*all 8

我会说不,这是胡扯.即使使用这些导入,Python 2和3之间仍然存在显着差异:例如,input()在Python 3中就像raw_input()在Python 2中一样; range()在Python 3中就像xrange()在Python 2中一样.只要范围很小,xrange()你就可以range()在Python 2中使用它,但如果它们很大,那么你的程序在Python 2和Python 2下可能会有非常不同的内存使用量. Python 3.

您可以在代码中添加以下内容:

try:
    range = xrange
    input = raw_input
except NameError:
    pass
Run Code Online (Sandbox Code Playgroud)

但是你必须找到所有这些边缘情况并修复它们.例如,也有keys()values()方法dict在Python 3中返回迭代器,但列出了在Python 2,所以你需要编写一个dict子类,"修复"是(从来就不是在代码中使用的字典文字没有包装他们,因为否则将是内置dict类型).

我想,通过使用__future__和各种修复,并限制自己编写代码在这样创建的Python的子集中,它将在2.x和3.x下运行,有可能编写在两者中运行的代码版本.看起来好像很多工作.有一个2to3实用的原因......


Len*_*bro 7

"这取决于"

否:将这些导入添加到Python 2代码中将不会使其在Python 3下运行.

是的:使用这些导入,您可以编写在Python 2和Python 3下运行的代码.

但是:再说一遍,你可以在没有这些进口的情况下做到这一点,其中一些,例如unicode_literals已经证明根本没有帮助.generators并且with_statement与Python 2到Python 3完全没有关系,这些是Python 2版本中添加的功能.

总而言之,这些进口产品有点像红鲱鱼,而且这种说法比错误更为错误.

但是,这并不意味着编写在Python 2和Python 3下运行的代码是不可能的,甚至是非常困难的.有关详细信息,请参阅http://python3porting.com/.

  • 作为旁注,从3.3开始,人们可以再次使用"u"unicode"` (2认同)

eca*_*mur 5

根据您的代码库的需求,这并非不可能.您可能会发现六个(2*3,哈哈)库是必不可少的; 另一个有用的工具是python-modernize,它试图将代码转换为交叉兼容状态.