将Python 3的`range`移植到Python 2是一种坏主意吗?

11 投票
2 回答
1082 浏览
提问于 2025-04-17 02:48

我有一门课要求用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中,这会消耗大量的内存。

2 个回答

6

你应该做的事情是,先确保你的代码在2.x版本下能正常运行,然后把它用2to3这个工具处理一下,最后检查一下处理后的代码在3.x版本下是否也能正常工作。这样一来,你就不需要像之前那样重新定义range了。

9

你可以使用 six 这个包,它是一个让 Python 2 和 3 兼容的工具库,由 Python 的核心开发者之一编写。这个包的一个特点是提供了一些标准的定义,用于重命名的模块和函数,比如把 xrange 改成 range。使用 six 是官方文档中推荐的众多方法之一,帮助你把 Python 2 的代码迁移到 Python 3,具体内容可以查看 Porting Python 2 Code to Python 3 HOWTO

撰写回答