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

标签 python portability

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

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

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

我在 6 中使用了错误的函数吗?还是 six 根本没有为 rangexrange 函数提供解决方案?

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

追加

正如 mgilson 所提到的:

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

是不是和six的版本有关,还是没有six.moves.range之类的东西?

最佳答案

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

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

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

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

try:
    xrange
except NameError:  # python3
    xrange = range

关于python - six.moves.builtins.range 在 Python 2 和 Python 3 中不一致,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22086804/

相关文章:

python - PySide.QtGui RuntimeError : '__init__' method of object's base class not called . ..但它是

python - 从多个列表和列表列表中获取唯一对象。然后创建一个包含所有列表中唯一对象的新列表

python - 在 Matplotlib 中保持绘图窗口打开

.net - PE Headers 的哪个字段表明 PE 文件是否有效?

c++ - 可移植 C++ 构建系统

c++ - 在可移植应用程序中使用 Windows DLL

python - `eli5.show_weights` 显示的标准偏差与`feature_importances_std_`中的值不一致

python - 将 hmmer --tblout 输出转换为 pandas 数据框

c# - VB.NET 比 C# 更便携吗?

sql - 如何在可移植 SQL 中包含特定于 PostgreSQL 的代码?