2015-06-30 19 views
6

Scrivendo per Python 2, io uso sempre xrange, ma viene rinominato in Python 3. Così ho principalmente scrivoQualunque importazione __future__ per incompatibilità range-xrange?

if sys.version.startswith('3'): 
    zrange = range 
else: 
    zrange = xrange 

e utilizzare zrange sotto. Esiste una soluzione più aggraziata (senza dipendere da pacchetti di terze parti), come lo from __future__ import unicode_literal speriamo?

+2

Si dovrebbe dare un'occhiata a [sei] (https://pypi.python.org/pypi/six). –

+0

No, non ci sono importazioni future, se lo vuoi un po 'più conciso 'zrange = range se sys.version.startswith (' 3 ') else xrange' –

risposta

9

No, non è disponibile l'importazione from __future__ e non è necessario utilizzare un pacchetto di terze parti. È sufficiente rilevare l'errore nome quando xrange non è disponibile:

try: 
    zrange = xrange 
except NameError: 
    zrange = range 

Non c'è davvero bisogno di test per le versioni.

Personalmente, non farei un nuovo nome, appena ri-uso xrange su Python 3:

try: 
    xrange 
except NameError: 
    xrange = range 

pacchetti che hanno bisogno di supportare sia Python 2 e Python 3 solito creare un modulo per gestire compat ponti come questi Vedere lo requests.compat module ad esempio, dove utilizzano un test di versione solo perché limita il numero di test a quello solo if.

+2

Stavo per scrivere lo stesso, ma non è sicuro che questo sia davvero * altro grazioso * rispetto al codice proprio dell'OP. –

+1

@PadraicCunningham: se 'range' è l'unica cosa * da collegare, preferisco usare il gestore delle eccezioni. Se ci sono più test, forse un controllo di versione è in ordine, in un modulo 'compat' dedicato. –

+0

Penso che l'OP cerchi semplicemente qualcosa che non esiste. –

Problemi correlati