Подтвердить что ты не робот

Является ли "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 это будет использовать безумный объем памяти.

4b9b3361

Ответ 1

Вы можете использовать пакет six, который предоставляет библиотеку совместимости Python 2 и 3 и написанную одним из основных разработчиков Python. Среди его функций - набор стандартных определений для переименованных модулей и функций, включая xrangerange. Использование six является одной из многих рекомендаций в официальном Портировании кода Python 2 на Python 3 HOWTO, включенном в набор документации Python.

Ответ 2

То, что вы, вероятно, должны делать, это убедиться, что оно работает чисто под 2.x, а затем передавая его через 2to3 и проверяя, что результат работает чисто в 3.x. Таким образом вам не придется проходить через обручи, такие как переопределение range, как вы уже сделали.