2015-06-30 8 views
6

Writting für Python 2, verwende ich xrange immer, aber es ist in Python 3. Also meist umbenannt ichIrgendwelche __future__ Import für Range-Xrange Inkompatibilität?

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

und verwenden zrange unten schreiben. Gibt es eine elegantere Lösung (ohne von 3rd-Party-Paket abhängig), wie from __future__ import unicode_literal hoffentlich?

+2

Sie sollten sich [sechs] (https://pypi.python.org/pypi/six) ansehen. –

+0

Nein, es gibt keinen zukünftigen Import, wenn Sie es ein wenig prägnanter 'zrange = Bereich wollen, wenn sys.version.startswith ('3') else xrange' –

Antwort

9

Nein, es gibt keinen from __future__ Import für dieses, noch müssen Sie ein Drittanbieter-Paket verwenden. Einfach fängt den Namen Fehler, wenn xrange nicht verfügbar:

try: 
    zrange = xrange 
except NameError: 
    zrange = range 

Es gibt nicht wirklich eine Notwendigkeit für die Versionen zu testen.

Ich persönlich würde nicht einen neuen Namen machen, nur wiederverwenden xrange auf Python 3:

try: 
    xrange 
except NameError: 
    xrange = range 

Pakete, die beide Python 2 und Python 3 in der Regel erstellen compat Modul unterstützen müssen zu handhaben Brücken wie diese. Sehen Sie zum Beispiel die requests.compat module, wo sie nur einen Versionstest verwenden, weil das die Anzahl der Tests auf nur die if beschränkt.

+2

Würde das gleiche schreiben, aber nicht sicher, das ist wirklich irgendein * more anmutig * als der OP-Code. –

+1

@PadraicCunningham: Wenn 'Bereich' das * einzige Ding * ist, das sie überbrücken müssen, dann bevorzuge ich den Ausnahmebehandler. Wenn es mehr Tests gibt, ist vielleicht eine Versionsprüfung in einem dedizierten Kompatibilitätsmodul in Ordnung. –

+0

Ich denke, das OP sucht einfach nach etwas, das nicht existiert. –

Verwandte Themen