grimboite/articles/dev/2014-08-27-six.md

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 vos print 'bidule': on passe à print('bidule') maintenant !
  • La fonction raw_input disparait au profit de input.
  • ...

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/.