【问题标题】:Is "backporting" Python 3's `range` to Python 2 a bad idea?将 Python 3 的“范围”“向后移植”到 Python 2 是个坏主意吗?
【发布时间】:2011-09-21 22:29:53
【问题描述】:

我的一个课程要求使用 Python 完成作业,作为练习,我一直在确保我的程序可以在 Python 2 和 Python 3 中运行,使用如下脚本:

#!/bin/bash
# Run some PyUnit tests
python2 test.py
python3 test.py

我一直在做的一件事是让range 使用这段代码在两个版本中工作相同:

import sys

# Backport Python 3's range to Python 2 so that this program will run
# identically in both versions.
if sys.version_info < (3, 0):
    range = xrange

这是个坏主意吗?

编辑:

原因是 xrangerange 在 Python 2 和 Python 3 中的工作方式不同,我希望我的代码在两者中做同样的事情。我可以反过来做,但是让 Python 3 像 Python 2 一样工作似乎很愚蠢,因为 Python 3 是“未来”。

这里有一个例子说明为什么只使用range 不够好:

for i in range(1000000000):
    do_something_with(i)

我显然没有使用列表,但在 Python 2 中,这将使用大量内存。

【问题讨论】:

  • 它真的不适用于 Python 2 的范围吗?
  • 我不会说这是一个坏主意,但重用名称 range 会很糟糕。如果我在 Python 2.x 代码中看到 range,我希望它返回一个列表而不是迭代器,并且不必搜索代码以查看名称是否已重新分配。一起使用不同的名称甚至重用 xrange 可能会更容易,因为它没有在 Python 3.x 中定义。
  • 你在做什么与xrange一起工作,但不是Python 2.x的range
  • @JeffMercado 将答案作为答案发布。为什么要发表评论?
  • @dkamins:我通常将我的意见保留为我可以支持的 cmets 和陈述,我会考虑做出回答。我正在考虑将其发布为答案(我的答案仍在起草中),但它主要是 AFAIK 的意见,因为我真的不知道这里最好的做法是关于 python 的预期编码标准。

标签: python python-3.x python-2.x


【解决方案1】:

您可以使用six 包,它提供了 Python 2 和 3 兼容性库,由 Python 核心开发人员之一编写。它的特性之一是重命名模块和函数的一组标准定义,包括xrange -> range。使用 six 是 Python 文档集中包含的官方 Porting Python 2 Code to Python 3 HOWTO 中的众多建议之一。

【讨论】:

    【解决方案2】:

    您可能应该做的是确保它在 2.x 下干净地工作,然后将它传递给 2to3 并验证结果在 3.x 中干净地工作。这样一来,您就不必像以前那样重新定义 range 之类的麻烦了。

    【讨论】:

    • 还有3to2 项目,它建立在 lib2to3 框架上,提供修复程序和执行反向操作的脚本,在这种情况下可能更有用。
    • 2 行代码如何“跳过箍”,但不断通过2to3 不是?
    • 现在是两行代码。谁知道完成后需要进行多少更改。
    • 嗯,您可以做的一件事是通过 2to3 运行代码以查看完成了多少更改。而且如果你为 2 和 3 并行开发,所需的差异通常很小,特别是如果你使用six
    猜你喜欢
    • 2012-06-13
    • 1970-01-01
    • 1970-01-01
    • 2017-06-18
    • 1970-01-01
    • 1970-01-01
    • 2018-06-05
    • 1970-01-01
    • 2015-06-09
    相关资源
    最近更新 更多