Makina Blog
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 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 !
Formations associées
Formations SIG / Cartographie
Formation Python pour l'analyse géospatiale
À distance (FOAD) Du 9 au 13 décembre
Voir la formationActualités en lien
Bien configurer ses tests Python avec tox et Travis
Le plus difficile dans le développement des tests unitaires c'est souvent de se motiver à écrire les premières lignes… Alors qu'une fois que c'est initié, ça devient très simple d'en ajouter. Nous verrons dans cet article de blog comment le faire rapidement avec tox et Travis !
Python : Bien configurer son environnement de développement
Comment utiliser les bonnes pratiques de développement Python.
Mythes et réalités des tests automatisés
Petit bestiaire des mythes autour des tests automatisés et des réalités correspondantes