2016-06-15 3 views
4

j'ai écrit un script que je voulais permettre à la fois Python 2 et Python 3.Activation `xrange` dans python3 pour la portabilité

Après l'importation division et print_function de __future__, ma seule préoccupation était que mon range retourne dans son ensemble array en Python 2, gaspillant du temps et de la mémoire.

J'ai ajouté les 3 lignes suivantes au début du script, comme solution de contournement:

if sys.version_info[0] == 3: 
    def xrange(i): 
     return range(i) 

Alors, je ne ai utilisé xrange dans mon code.

Y at-il une façon plus élégante de le faire plutôt que ma solution de contournement?

+2

Il existe des bibliothèques dédiées pour vous, par ex. ['six'] (https://pypi.python.org/pypi/six). –

+0

Je ne veux pas télécharger de bibliothèques tierces – SomethingSomething

+1

Est-ce que votre script demande vraiment beaucoup de temps et de mémoire? –

Répondre

9

Vous pouvez simplifier un peu:

if sys.version_info[0] == 3: 
    xrange = range 

je le ferais dans l'autre sens:

if sys.version_info[0] == 2: 
    range = xrange 

Si vous voulez jamais laisser tomber le support de Python 2.x, vous pouvez simplement supprimer ces deux lignes sans passer par tout votre code.

Cependant, je suggère fortement d'envisager le six library. C'est la norme de facto pour activer la compatibilité Python 2 et 3.

from six.moves import range 
+0

Je suis totalement d'accord que l'autre façon que vous suggérez semble plus utilisable. En fait, le 'range' de Python2 agit comme' range' de Python3, au lieu d'intuber 'xrange' en Python3 et en laissant la' range' de Python3 différente de 'range' de Python2 – SomethingSomething