Comment porter le code Python 2 sur Python 3

introduction

Python a été développé à la fin des années 1980 et publié pour la première fois en 1991. Avec un nom inspiré du groupe de comédie britannique Monty Python, Python a été conçu pour succéder à l’impératif langage de programmation ABC. Dans sa première itération, Python incluait déjà la gestion des exceptions, functions et https: //www.digitalocean. .com / communauté / tutoriels / arrangement-héritage-en-python-3 [classes avec héritage].

Ce tutoriel vous guidera à travers les meilleures pratiques et considérations à prendre en compte lors de la migration de code de Python 2 vers Python 3, et vous indiquera si vous devez conserver un code compatible avec les deux versions.

Contexte

  • Python 2 * a été publié en 2000, signalant un processus de développement du langage plus transparent et inclusif. Il incluait beaucoup plus de fonctionnalités de programmation et en ajoutait d’autres tout au long de son développement.

  • Python 3 * est considéré comme le futur de Python et est la version du langage en cours de développement. Publié fin 2008, Python 3 corrige et corrige les défauts de conception intrinsèques. Cependant, l’adoption de Python 3 a été lente en raison du fait que le langage n’était pas rétrocompatible avec Python 2.

  • Python 2.7 * a été publié en 2010 en tant que dernière des versions 2.x. L’objectif de Python 2.7 était de permettre aux utilisateurs de Python 2.x de transférer plus facilement des fonctionnalités sur Python 3 en fournissant une certaine mesure de compatibilité entre les deux.

Vous pouvez en apprendre plus sur les versions de Python et sur les options à utiliser en lisant notre tutoriel “https://www.digitalocean.com/community/tutorials/python-2-vs-python-3-practical-considerations-2[Python 2 vs Python 3: Considérations pratiques]. ”

Commencez avec Python 2.7

Pour passer à Python 3 ou prendre en charge Python 2 et Python 3 simultanément, vous devez vous assurer que votre code Python 2 est entièrement compatible avec Python 2.7.

De nombreux développeurs travaillent déjà exclusivement avec le code Python 2.7, mais il est important de confirmer que tout ce qui est uniquement pris en charge par les versions précédentes fonctionne correctement avec Python 2.7 et est cohérent avec le style Python 2.7.

S’assurer que votre code est en Python 2.7 est particulièrement important car c’est la seule version de Python 2 qui est toujours maintenue et qui reçoit des corrections de bugs. Si vous travaillez sur une version antérieure de Python 2, vous devrez résoudre les problèmes que vous rencontrez avec du code qui n’est plus pris en charge et qui ne reçoit plus de buxfix.

En outre, certains outils facilitant le portage du code, tels que le paquet Pylint qui recherche les erreurs de programmation, ne sont pas pris en charge par les versions antérieures de Python. que 2,7.

Il est important de garder à l’esprit que, même si Python 2.7 est toujours pris en charge et maintenu, il finira par atteindre sa fin de vie. PEP 373 détaille le calendrier de publication de Python 2.7 et, au moment de la rédaction de ce document, marque comme date d’expiration 2020.

Couverture de test

La création de cas de test peut constituer une partie importante du travail de migration du code Python 2 vers Python 3. Si vous gérez plusieurs versions de Python, vous devez également vous assurer que votre suite de tests dispose d’une bonne couverture afin de vous assurer que chaque version fonctionne toujours comme prévu.

Dans le cadre de vos tests, vous pouvez ajouter des observations Python interactives à la docstrings de toutes vos fonctions, méthodes, classes et modules, puis utiliser la fonction intégrée https://docs.python.org/3.6/library/doctest. html [+ doctest + module] pour vérifier qu’ils fonctionnent comme indiqué.

En plus de + doctest +, vous pouvez utiliser le paquet https://pypi.python.org/pypi/coverage [+ coverage.py +] pour suivre les couvertures de tests unitaires. Cet outil surveillera votre programme et notera quelles parties du code ont été exécutées et quelles parties auraient pu être exécutées mais ne l’ont pas été. + coverage.py + peut imprimer des rapports en ligne de commande ou fournir une sortie HTML. Il est généralement utilisé pour mesurer l’efficacité des tests, en vous montrant quelles parties du code sont testées et lesquelles ne le sont pas.

Gardez à l’esprit que vous ne visez pas une couverture de test à 100% - vous voulez vous assurer de couvrir tout code source de confusion ou inhabituel. Pour les meilleures pratiques, vous devez viser une couverture de 80%.

En savoir plus sur les différences entre Python 2 et Python 3

En étudiant les différences entre Python 2 et Python 3, vous pourrez exploiter les nouvelles fonctionnalités disponibles ou disponibles dans Python 3.

Notre guide sur “https://www.digitalocean.com/community/tutorials/python-2-vs-python-3-practical-considerations-2[Python 2 vs Python 3]” passe en revue certains des https: // www.digitalocean.com/community/tutorials/python-2-vs-python-3-practical-considerations-2#key-differences[key] entre les deux versions, et vous pouvez consulter le https: //docs.python. .org / 3 / [documentation officielle de Python] pour plus de détails.

Lorsque vous commencez à utiliser le portage et la migration, vous pouvez maintenant mettre en œuvre plusieurs modifications de syntaxe.

+ print +

The + print + _ L’instruction de Python 2 a été remplacée par a_ + print () + function en Python 3.

Python 2 Python 3

print "Hello, World!"

print("Hello, World!")

+ exec +

The + exec + _ L’instruction de Python 2 a été remplacée par une fonction autorisant les locales et les globales explicites dans Python 3._

Python 2 Python 3

exec code

exec(code)

exec code in globals

exec(code, globals)

exec code in (globals, locals)

exec(code, globals, locals)

+ / + et + // +

Python 2 divise les étages avec le + / + https: //www.digitalocean.com/community/tutorials/how-to-do-math-in-python-3-with-operators [opérateur], Python 3 a été introduit + // + pour division au sol .

Python 2 Python 3

5 / 2 = 2

5 / 2 = 2.5

5 // 2 = 2

Pour utiliser ces opérateurs dans Python 2, import + division + à partir du `+ future + `module:

from __future__ import division

En savoir plus sur division avec des entiers .

+ augmenter +

En Python 3, la création d’exceptions avec des arguments nécessite des parenthèses et strings ne peut pas être utilisé comme exception.

Python 2 Python 3

raise Exception, args

raise Exception

raise Exception(args)

raise Exception, args, traceback

raise Exception(args).with_traceback(traceback)

raise "Error"

raise Exception("Error")

+ sauf +

En Python 2, il était difficile de répertorier plusieurs exceptions, mais cela a changé dans Python 3.

Notez que _ + en tant que _ _ est utilisé explicitement avec _` + sauf + ` dans Python 3_

Python 2 Python 3

except Exception, variable:

except AnException as variable:

except (OneException, TwoException) as variable:

+ def +

_En Python 2, les fonctions peuvent prendre des séquences telles que tuples ou https://www.digitalocean.com/community/tutorials / comprehension-lists-in-python-3 [listes]. En Python 3, ce déballage a été supprimé.

Python 2 Python 3

def function(arg1, (x, y)):

def function(arg1, x_y): x, y = x_y

+ expr +

La syntaxe de backtick de Python 2 n’existe plus. Use + repr () + or + str.format () + _ in Python 3._

Python 2 Python 3

+x = \`355/113\+`

x = repr(355/113):

Formatage de chaîne

La syntaxe de formatage des chaînes a été modifiée de Python 2 à Python 3.

Python 2 Python 3

"%d %s" % (i, s)

"{} {}".format(i, s)

"%d/%d=%f" % (355, 113, 355/113)

"{:d}/{:d}={:f}".format(355, 113, 355/113)

+ classe +

Il n’est pas nécessaire d’indiquer + objet _ dans Python 3.