2.2 KiB
Title | Date | Slug | Tags |
---|---|---|---|
Compatibilité Python 2.x/3.x | 2014-08-27 | python-six-compat-2.x-3.x | python, six, dev, 2to3 |
En adaptant une appli qui tourne sur du Python 2.7+ vers du Python 3.4, on remarque qu'il y a beaucoup de nouveautés. Préparez-vous à adapter votre code pour que cela fonctionne :-)
Parmi les quelques nouveautés:
- La déclaration
print
devient une fonction; oubliez donc tous vosprint 'bidule'
: on passe àprint('bidule')
maintenant ! - La fonction
raw_input
disparait au profit deinput
. - ...
Petit exemple avec la fonction raw_input
qui devient input
. Une manière de faire est la suivante:
def _default_input_func(*args, **kwargs):
"""
Check if we can use `input()` from python3.
If not, fallback to `raw_input()`.
"""
func = None
try:
func = input(*args, **kwargs)
except NameError:
func = raw_input(*args, **kwargs)
return func
On utilise alors cette nouvelle fonction _default_input_func(*args, **kwargs)
quand on attend un input de l'utilisateur. Bref, c'est sympa, mais cela ne fonctionne que si une fonction est renommée entre deux versions majeures de l'interpréteur.
Une autre manière de faire pour que votre code tourne autant sur Python 2.7 que sur Python 3.x est de passer par six (2 to 3 equals 6, oui, simplement). En gros, l'idée est de passer par des fonctions tampons, qui feront la redirection vers la bonne méthode ou fonction (en fonction de la version de l'interpréteur). Au niveau du code par contre, on appelle directement la bonne fonction définie dans le package six
.
Pour revenir à l'exemple ci-dessus, on pourrait importer la fonction input
du package six
et l'utiliser, indépendamment de la version de l'interpréteur utilisée.
from six.moves import input
En gros, tout se passe grâce à deux flags: six.PY2
et six.PY3
, qui indiquent quelle version est utilisée. Cela revient plus ou moins à notre super fonction _default_input_func
, sauf que c'est géré, maintenu et centralisé. La liste des fonctions uniformisées est disponible ici: https://pythonhosted.org/six/.