2011-09-21 11 views
11

Una de mis clases requiere tareas que deben completarse en Python, y como un ejercicio, he estado haciendo que mis programas funcionan tanto en Python 2 y Python 3, utilizando un script como el siguiente:¿Es una "mala idea" "backporting" el "rango" de Python 3 para Python 2?

#!/bin/bash 
# Run some PyUnit tests 
python2 test.py 
python3 test.py 

Uno lo que he estado haciendo es hacer el trabajo range el mismo en ambas versiones con este pedazo de código:

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 

¿es esta una mala idea?

EDIT:

La razón de esto es que xrange y range funcionan de forma diferente en Python 2 y Python 3, y yo quiero que mi código para hacer lo mismo en ambos. Podría hacerlo al revés, pero hacer que Python 3 funcione como Python 2 parece estúpido, ya que Python 3 es "el futuro".

He aquí un ejemplo de por qué sólo usar range no es lo suficientemente bueno:

for i in range(1000000000): 
    do_something_with(i) 

Estoy, obviamente, no utilizando la lista, pero en Python 2, para ello se utiliza una cantidad insana de memoria.

+1

¿Realmente no funciona con el rango de Python 2? –

+1

No diría que es una mala idea, pero sería malo reutilizar el nombre 'range'. Si veo 'range' en el código de Python 2.x, esperaría que devuelva una lista y no un iterador y no tenga que buscar a través del código para ver si el nombre ha sido reasignado. Probablemente sea más fácil usar un nombre diferente o incluso reutilizar 'xrange' ya que no está definido en Python 3.x. –

+1

¿Qué estás haciendo que funciona con 'xrange' pero no con' range' de Python 2.x? –

Respuesta

8

Puede usar el paquete six que proporciona una biblioteca de compatibilidad Python 2 y 3 y está escrito por uno de los desarrolladores principales de Python. Entre sus características se encuentra un conjunto de definiciones estándar para los módulos y funciones renombrados, que incluyen xrange ->range. El uso de six es una de muchas recomendaciones en el Porting Python 2 Code to Python 3 HOWTO oficial incluido en el conjunto de Documentación de Python.

6

Lo que probablemente debe ser hacer es asegurarse de que funciona limpiamente bajo 2.x, y luego pasándolo a través de 2to3 y verificar que el resultado trabaja limpiamente en 3.x. De esta forma, no tendrá que pasar por aros como redefinir range como ya lo hizo.

+1

, también está el proyecto [3to2] (https://bitbucket.org/amentajo/lib3to2/overview), que se basa en el marco de trabajo lib2to3 para proporcionar correcciones y un script para haciendo lo contrario, puede ser más útil en este caso. –

+2

¿Cómo son 2 líneas de código "saltando a través de aros", pero pasarlo a través de '2to3' constantemente no lo es? –

+1

Son dos líneas de código * ahora *. Quién sabe cuántos cambios se requerirán una vez hecho. –

Cuestiones relacionadas