six.moves.builtins.range在Python 2和Python 3中不一致

时间:2014-02-28 05:15:02

标签: python portability

对于一个非常大的整数范围,应该使用xrange(Python 2),在Python 3中将其重命名为range。我假设模块six可以提供一致的原因写入。

但我发现six.moves.builtins.range在Python 2中返回一个列表,在Python 3中返回一个可迭代的非列表对象,就像名称range一样。

此外,Python 2中不存在six.moves.builtins.xrange

我在six中使用了错误的功能吗?或者六个根本没有为rangexrange函数提供解决方案?

我知道我可以测试sys.version[0]并相应地重命名该功能。我只是在寻找“不要重复自己”的解决方案。

APPEND

正如mgilson所说:

>>> import six 
>>> six.moves.range
AttributeError: '_MovedItems' object has no attribute 'range'

它是否与six的版本相关,还是没有six.moves.range这样的内容?

1 个答案:

答案 0 :(得分:10)

我相信你只想要six.moves.range。不,six.moves.builtins.range

>>> # tested on python2.x..
>>> import six.moves as sm
>>> sm.range
<type 'xrange'>

这里的原因是six.moves.builtins是版本无关的“builtins”模块。这只是让你访问内置函数 - 它实际上并没有改变任何内置函数

通常情况下,我觉得不需要在这种情况下引入外部依赖。我通常只是在源文件的顶部添加这样的东西:

try:
    xrange
except NameError:  # python3
    xrange = range