【发布时间】:2015-08-06 00:02:16
【问题描述】:
我正在尝试使我的一些代码与 Python 2 和 3 兼容。
目前,我正在为range/xrange 之类的函数和dict.items/dict.iteritems 之类的方法而苦苦挣扎。理想情况下,我希望我的代码能够在 Python 3.x 中使用前者,而在 Python 2.x 中使用后者。
在我看来,使用if/else 是实现这一点的最简单方法:
if py >= 3:
for item in array.items()
...
else:
for item in array.iteritems()
但是,这样做会导致大量重复且丑陋的代码。有没有更好的方法仅使用标准库?我可以在代码开头的某处声明总是使用range/dict.items如果py >= 3和xrange/dict.iteritems如果不是?
有可能做这样的事情吗?
if py < 3:
use xrange as range
我环顾四周,我知道有几个库,比如 6 个 o futurize) 用于解决这个问题。但是,我正在使用仅运行 python 2.7 的服务器,并且不允许在其上安装任何额外的库。我有一些我想使用的 python3 代码,但我也想只维护一个版本的代码。
【问题讨论】:
-
不要重新发明轮子。为什么限制使用标准库? pypi.python.org/pypi/six
-
为什么对这个问题投反对票?还不够清楚吗?
-
我建议使用
six模块。如果您不想安装它,您仍然可以查看它的代码,看看它是如何处理许多这些问题的,然后只需手动将它们选择性地添加到您自己的代码中。 -
我想知道,为什么 ppl 试图强制 OP 使用 3d 零件库,facepalm。就像 jQuery 的孩子们......他们真的认为他们知道 JavaScript,在这里也是如此。对于 OP,在大多数情况下,您可以通过 dict 以其他方式循环 - 例如通过键或值。这不是迭代器,更“简单”的方式,但他支持所有版本的 Python,没有像“六”这样的自行车。最后,你不应该编写兼容的代码,这样做你将不会使用 py2 或 py3 的全部力量,结果将有一些平均的、未优化且难以调试的代码(由于兼容性层)
-
@alec_djinn Python3 正在/正在打破 python2 的向后兼容性。它总是这样,它就是这样设计的。这意味着如果你想同时支持两者,你需要有一个真正的兼容层,例如 six,它是受信任的、经过测试的,并且已经在大型项目(例如 Django)中得到证明。 不是你在几天内自己破解的。
标签: python python-2.7 python-3.x compatibility