Является ли "обратная передача" Python 3 `range` в Python 2 плохой идеей? - PullRequest
11 голосов
/ 22 сентября 2011

Один из моих классов требует выполнения заданий на 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 ]

9 голосов
/ 22 сентября 2011

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

6 голосов
/ 22 сентября 2011

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

...