48 votes

Écrire du code Python 2.7 aussi proche que possible de la syntaxe Python 3.x

Comme Django ne prend pas encore en charge Python 3.x, j'utilise Python 2.7. Cependant, j'aimerais commencer à me familiariser avec la nouvelle syntaxe de Python 3.x autant que possible. Ce qui m'amène à la question suivante :

  • Quelle est la meilleure façon d'écrire du code Python 2.7 qui sera aussi compatible que possible avec Python 3.x ?

Je sais que courir python -3 sera

Avertir des incompatibilités avec Python 3.x que 2to3 ne peut pas résoudre de manière triviale.

Cependant, j'aimerais m'habituer à la syntaxe de Python 3.x tout en continuant à utiliser Python 2.7.

Par exemple, il semble que je devrais utiliser les importations suivantes dans mon code :

from __future__ import print_function
from __future__ import unicode_literals
from __future__ import division
from __future__ import absolute_import

Les quatre points ci-dessus __future__ import sont obligatoires à partir de Python 3.0, mais ne le sont pas dans la version 2.7, comme indiqué dans la rubrique Documentation de Python 2.7.3 27.11. Définitions des déclarations futures

Quoi d'autre ?

19voto

Eli Bendersky Points 82298

De nos jours, de nombreux modules sont réécrits de manière à pouvoir être exécutés à la fois sur Python 2 et Python 3. Cela ne s'avère pas très difficile et, à l'avenir, il sera très facile d'abandonner le support de Python 2.

Jetez un coup d'œil à la six qui aide à cette tâche, en encapsulant de nombreuses différences d'une manière pratique :

Six fournit des utilitaires simples pour couvrir les différences entre Python 2 et Python 3.

Son site web (et bien sûr, son code) énumère de nombreuses façons de rendre cela possible.

10voto

Joschua Points 1407

Placez le code suivant dans un fichier py3k.py et l'importer comme ceci : from py3k import * . Vous devez cependant le mettre dans chaque fichier, mais vous pouvez même le laisser là si personne n'utilise plus Python 2.x ou vous pouvez simplement rechercher et remplacer la ligne d'importation par des espaces, puis supprimer le fichier.

try:
    from future_builtins import *
except ImportError:
    pass

try:
    input = raw_input
    range = xrange
except NameError:
    pass

Et voici à quoi ressemble mon fichier modèle :

#!/usr/bin/env python
# -*- coding: utf-8 -*-

"""

"""

from __future__ import division, absolute_import, \
                       print_function, unicode_literals
from utils.py3k import *  # @UnusedWildImport

#

8voto

De nombreux IDE Python peuvent être d'une grande aide ici.

PyCharm par exemple, peut être configuré pour vérifier la compatibilité avec une gamme quelconque de versions,

enter image description here

et de signaler les problèmes à tout niveau de gravité :

enter image description here

8voto

Lennart Regebro Points 52510

Vous devez également utiliser les nouvelles syntaxes d'exception, c'est-à-dire plus de

try:
     raise Exception, "Message"
except Exception, e:
     pass

à la place, vous devriez faire :

try:
     raise Exception("Message")
except Exception as e:
     pass

Veillez également à préfixer toutes vos chaînes binaires par un b, par exemple :

b'Ceci est une chaîne binaire'

Pour une couverture plus complète de ce sujet, voir http://python3porting.com/noconv.html

6voto

Jakob Bowyer Points 12873
try:
    input = raw_input
    range = xrange
except NameError:
    pass

Sont deux qui me viennent à l'esprit...

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X