2011-09-21 11 views
11

Una delle mie classi richiede compiti da completare in Python, e come un esercizio, che ho fatto che i miei programmi funzionano sia in Python 2 e Python 3, utilizzando uno script come questo:Il "backporting" di `range` di Python 3 in Python 2 è una cattiva idea?

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

One cosa che ho fatto è rendere range lavoro lo stesso in entrambe le versioni con questo pezzo di codice:

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 

questa è una cattiva idea?

EDIT:

La ragione di questo è che xrange e range funzionano in modo diverso in Python 2 e Python 3, e voglio che il mio codice per fare la stessa cosa in entrambi. Potrei farlo al contrario, ma far funzionare Python 3 come Python 2 sembra stupido, poiché Python 3 è "il futuro".

Ecco un esempio del perché solo usando range non è abbastanza buono:

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

sto, ovviamente, non utilizzando l'elenco, ma in Python 2, questo utilizzerà una quantità folle di memoria.

+1

Non funziona davvero con la gamma di Python 2? –

+1

Non direi che sia una cattiva idea, ma sarebbe un brutto riutilizzo del nome 'range'. Se vedo 'range' nel codice Python 2.x, mi aspetterei che restituisca un elenco e non un iteratore e non debba cercare attraverso il codice per vedere se il nome è stato riassegnato. Probabilmente sarebbe più facile usare un nome diverso tutti insieme o anche riutilizzare 'xrange' perché non è definito in Python 3.x. –

+1

Che cosa stai facendo funziona con 'xrange' ma non con' range' di Python 2.x? –

risposta

8

È possibile utilizzare il pacchetto six che fornisce una libreria di compatibilità Python 2 e 3 e scritto da uno degli sviluppatori principali Python. Tra le sue caratteristiche c'è un insieme di definizioni standard per moduli e funzioni rinominate, tra cui xrange ->range. L'uso di six è uno dei molti consigli nello Porting Python 2 Code to Python 3 HOWTO ufficiale incluso nel set di documentazione di Python.

6

Quello che probabilmente dovrebbe essere fare è fare in modo che funziona in modo pulito sotto 2.x, e poi passando attraverso 2to3 e verificando che il risultato funziona in modo pulito in 3.x. In questo modo non dovrai attraversare cerchi come ridefinire range come hai già fatto.

+1

c'è anche il progetto [3to2] (https://bitbucket.org/amentajo/lib3to2/overview), che si basa sul framework lib2to3 per fornire fixer e uno script per facendo il contrario, potrebbe essere più utile in questo caso. –

+2

In che modo 2 linee di codice "saltano attraverso i cerchi", ma non passano costantemente attraverso '2to3'? –

+1

Sono due righe di codice * ora *. Chissà quanti cambiamenti saranno necessari una volta fatto. –

Problemi correlati