问题 向Python 2“回归”Python 3的“范围”是一个坏主意吗?


我的一个类需要在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

这是一个坏主意吗?

编辑:

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

这是一个为什么只是使用的例子 range 不够好:

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

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


4749
2017-09-21 22:29


起源

它真的不适用于Python 2的范围? - Josh Lee
我不会说这是一个坏主意,但重用这个名字会很糟糕 range。如果我明白了 range 在Python 2.x代码中,我希望它返回一个列表而不是迭代器,而不必搜索代码以查看该名称是否已被重新分配。一起使用不同的名称甚至重用可能会更容易 xrange 相反,因为它没有在Python 3.x中定义。 - Jeff Mercado
你在做什么工作 xrange 但不是Python 2.x的 range? - Peter Graham
@JeffMercado发布答案作为答案。为什么要评论这个? - dkamins
@dkamins:我通常把我的观点留作我可以备份的评论和陈述,我会考虑回答。我正在考虑发布这个作为答案(仍然有我的答案草拟)但它转向主要是意见AFAIK,因为我真的不知道这里最好的事情是关于python的预期编码标准。 - Jeff Mercado


答案:


你可以使用  package,提供Python 2和3兼容库,由一个Python核心开发人员编写。其功能之一是重命名的模块和功能的一组标准定义,包括 xrange  - > range。指某东西的用途 six 是该官员的众多建议之一 将Python 2代码移植到Python 3 HOWTO 包含在Python文档集中。


8
2017-09-22 01:34





你可能是什么 应该 正在做的是确保它在2.x下干净地工作,然后通过它 2to3 并验证结果在3.x中干净利落。这样你就不必经历诸如重新定义之类的箍 range 就像你已经做的那样。


6
2017-09-21 22:33



还有 3to2 project,它建立在lib2to3框架上以提供修复程序和用于执行反向的脚本,在这种情况下它可能更有用。 - Eli Collins
2行代码如何“跳过箍”,但是通过它 2to3 经常不是吗? - Brendan Long
这是两行代码 现在。谁知道完成后需要进行多少更改。 - Ignacio Vazquez-Abrams
好吧,你可以做的一件事是通过2to3运行代码来查看完成了多少更改。如果您在2和3中并行开发,则所需的差异通常很小,尤其是在您使用时 six。 - Lennart Regebro