Является ли "backporting" Python 3 `range` для Python 2 плохая идея?
Один из моих классов требует, чтобы задания выполнялись в Python, и в качестве упражнения я убедился, что мои программы работают как на Python 2, так и на Python 3, используя script следующим образом:
#!/bin/bash
# Run some PyUnit tests
python2 test.py
python3 test.py
Одна вещь, которую я делал, заключается в том, что range
работает одинаково в обеих версиях с этим фрагментом кода:
import sys
# Backport Python 3 range to Python 2 so that this program will run
# identically in both versions.
if sys.version_info < (3, 0):
range = xrange
Это плохая идея?
EDIT:
Причиной этого является то, что xrange
и range
работают по-разному в Python 2 и Python 3, и я хочу, чтобы мой код делал то же самое в обоих. Я мог бы сделать это наоборот, но сделать Python 3 похожим на Python 2, кажется глупым, поскольку Python 3 - это "будущее".
Вот пример того, почему просто использовать range
недостаточно хорошо:
for i in range(1000000000):
do_something_with(i)
Я, очевидно, не пользуюсь списком, но в Python 2 это будет использовать безумный объем памяти.
Ответы
Ответ 1
Вы можете использовать пакет six, который предоставляет библиотеку совместимости Python 2 и 3 и написанную одним из основных разработчиков Python. Среди его функций - набор стандартных определений для переименованных модулей и функций, включая xrange
→ range
. Использование six
является одной из многих рекомендаций в официальном Портировании кода Python 2 на Python 3 HOWTO, включенном в набор документации Python.
Ответ 2
То, что вы, вероятно, должны делать, это убедиться, что оно работает чисто под 2.x, а затем передавая его через 2to3
и проверяя, что результат работает чисто в 3.x. Таким образом вам не придется проходить через обручи, такие как переопределение range
, как вы уже сделали.