Migrer une application de Python 2 à Python 3

Le support de Python 2 est officiellement terminé, c'est le moment de passer vos applications à Python 3 ! Voici quelques conseils pour réussir cette migration.

Le blog Makina-corpus

Le support de Python 2 est officiellement terminé, c'est le moment de passer vos applications à Python 3 ! Voici quelques conseils pour réussir cette migration.

Le moyen le plus simple de migrer votre projet de Python 2 à Python 3 est d'utiliser le script 2to3.

Attention, veillez à ce que l’exécution de votre programme ne soit pas modifiée.

À faire avant la migration 2to3

Dans un premier temps la mise en place des tests unitaires est importante afin de s'assurer que l'intégralité de son application fonctionne une fois la migration effectuée.

Ensuite, mettez à jour vos dépendances pour n'avoir que des dépendances compatibles avec Python 3. La plupart du temps, des versions compatibles à la fois Python 2 et Python 3 existent.

from __future__ import division, absolute_import, unicode_literals

2to3

L'utilisation du script est simple. Ainsi, pour convertir un fichier de Python 2 à Python 3, il suffit de faire :

2to3 -w example.py

Il est également possible de passer directement un dossier :

2to3 -w src

Depuis Python 3.2.3, une nouvelle option permet de convertir le code dans un nouveau dossier, ce qui permet de facilement comparer les deux versions du code :

2to3 --output-dir=python3-version/src -W -n python2-version/src

À faire après la migration 2to3

Tout d'abord, passer sur tous les changements réalisés et les comprendre ! Certains changements ne sont pas toujours nécessaires pour le bon fonctionnement de l'application mais ceux-ci ont pu être réalisés pour garder le même comportement entre Python 2 et Python 3.

Par exemple, en Python 2 la plupart des méthodes de dictionnaire -`dict.values`, `dict.items`, etc. - retournent une liste. Cela n'est plus le cas en Python 3, ces méthodes deviennent des générateurs et retournent donc des itérateurs. Ainsi, `2to3` convertit le code suivant :

# Python 2
for value in my_dict.values():
    pass

En :

# Python 3
for value in list(my_dict.values()):
    pass

Cela correspond strictement à la même chose. Mais le fait de convertir en liste n'est absolument pas nécessaire dans ce cas de figure. Donc list() peut sans souci être enlevée, cela rend le code moins lourd et plus maintenable.

Une fois le code relu, n'hésitez pas à mettre à jour les dépendances vers une version compatible uniquement Python 3, tant que cela ne demande pas de modifier trop le code existant de l'application. Il est toujours préférable d'avoir des dépendances le plus à jour possible. Cependant, le temps nécessaire pour les mettre à jour en cas de changement d'API de la dépendance n'est pas forcément facile à estimer ainsi cela se fait souvent au cas par cas.

Bien sûr, n'oubliez pas de faire passer les tests unitaires à chaque étape. Certains changements de comportements pourront poser un problème, les tests permettent de détecter ce dernier. Voici des exemples de changements de comportements :

  • le passage de toutes les chaînes en unicode par défaut.
  • open qui ouvre désormais les fichiers en mode texte et non en mode binaire par défaut.
  • la méthode __unicode__ remplacée par la méthode __str__
  • Etc.

Vous avez désormais toutes les clés en main pour réussir votre migration de Python 2 vers Python 3 !

Inscription à la newsletter

Nous vous avons convaincus