将Python 3的`range`移植到Python 2是一种坏主意吗?
我有一门课要求用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中,这会消耗大量的内存。
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。