25.4. 2to3 — Traduction automatique de code en Python 2 vers Python 3¶
2to3 est un programme Python qui lit du code source en Python 2.x et applique une suite de correcteurs pour le transformer en code Python 3.x valide. La bibliothèque standard contient un ensemble riche de correcteurs qui gèreront quasiment tout le code. La bibliothèque lib2to3
utilisée par 2to3 est cependant une bibliothèque flexible et générique, il est donc possible d’écrire vos propres correcteurs pour 2to3. lib2to3
pourrait aussi être adaptée à des applications personnalisées dans lesquelles le code Python doit être édité automatiquement.
25.4.1. Utilisation de 2to3¶
2to3 sera généralement installé avec l’interpréteur Python en tant que script. Il est également situé dans le dossier Tools/scripts
à racine de Python.
Les arguments de base de 2to3 sont une liste de fichiers et de répertoires à transformer. Les répertoires sont parcourus récursivement pour trouver les sources Python.
Voici un exemple de fichier source Python 2.x, example.py
:
def greet(name):
print "Hello, {0}!".format(name)
print "What's your name?"
name = raw_input()
greet(name)
Il peut être converti en code Python 3.x par 2to3 en ligne de commande :
$ 2to3 example.py
A diff against the original source file is printed. 2to3 can also write the
needed modifications right back to the source file. (A backup of the original
file is made unless -n
is also given.) Writing the changes back is
enabled with the -w
flag:
$ 2to3 -w example.py
Après transformation, example.py
ressemble à :
def greet(name):
print("Hello, {0}!".format(name))
print("What's your name?")
name = input()
greet(name)
Les commentaires et les retraits sont préservés tout au long du processus de traduction.
By default, 2to3 runs a set of predefined fixers. The
-l
flag lists all available fixers. An explicit set of fixers to run
can be given with -f
. Likewise the -x
explicitly disables a
fixer. The following example runs only the imports
and has_key
fixers:
$ 2to3 -f imports -f has_key example.py
Cette commande exécute tous les correcteurs, sauf le correcteurs apply
:
$ 2to3 -x apply example.py
Certains correcteurs sont explicites, ce qui signifie qu’ils ne sont pas exécutés par défaut et doivent être énumérés sur la ligne de commande à exécuter. Ici, en plus des correcteurs par défaut, le correcteur idioms
est exécuté :
$ 2to3 -f all -f idioms example.py
Notez que passer all
active tous les correcteurs par défaut.
Parfois, 2to3 trouvera un endroit dans votre code source qui doit être changé, mais qu’il ne peut pas résoudre automatiquement. Dans ce cas, 2to3 affiche un avertissement sous la comparaison d’un fichier. Vous devez traiter l’avertissement afin d’avoir un code conforme à Python 3.x.
2to3 peut également réusiner les doctests. Pour activer ce mode, utilisez -d
. Notez que seul les doctests seront réusinés. Cela ne nécessite pas que le module soit du Python valide. Par exemple, des doctests tels que des exemples dans un document reST peuvent également être réusinés avec cette option.
L’option -v
augmente la quantité de messages générés par le processus de traduction.
Since some print statements can be parsed as function calls or statements, 2to3
cannot always read files containing the print function. When 2to3 detects the
presence of the from __future__ import print_function
compiler directive, it
modifies its internal grammar to interpret print()
as a function. This
change can also be enabled manually with the -p
flag. Use
-p
to run fixers on code that already has had its print statements
converted.
The -o
or --output-dir
option allows specification of an
alternate directory for processed output files to be written to. The
-n
flag is required when using this as backup files do not make sense
when not overwriting the input files.
Nouveau dans la version 2.7.3: The -o
option was added.
The -W
or --write-unchanged-files
flag tells 2to3 to always
write output files even if no changes were required to the file. This is most
useful with -o
so that an entire Python source tree is copied with
translation from one directory to another.
This option implies the -w
flag as it would not make sense otherwise.
Nouveau dans la version 2.7.3: L’option -W
a été ajoutée.
The --add-suffix
option specifies a string to append to all output
filenames. The -n
flag is required when specifying this as backups
are not necessary when writing to different filenames. Example:
$ 2to3 -n -W --add-suffix=3 example.py
Écrit un fichier converti nommé example.py3
.
Nouveau dans la version 2.7.3: The --add-suffix
option was added.
Pour traduire un projet entier d’une arborescence de répertoires à une autre, utilisez :
$ 2to3 --output-dir=python3-version/mycode -W -n python2-version/mycode
25.4.2. Correcteurs¶
Chaque étape de la transformation du code est encapsulée dans un correcteur. La commande 2to3 -l
les énumère. Comme documenté ci-dessus, chacun peut être activé ou désactivé individuellement. Ils sont décrits plus en détails ici.
-
apply
¶ Supprime l’usage d”
apply()
. Par exemple,apply(function, *args, **kwargs)
est converti enfunction(*args, **kwargs)
.
-
asserts
¶ Remplace les noms de méthodes obsolètes du module
unittest
par les bons.De
À
failUnlessEqual(a, b)
assertEquals(a, b)
failIfEqual(a, b)
assertNotEquals(a, b)
failUnless(a)
assert_(a)
failIf(a)
failUnlessRaises(exc, cal)
failUnlessAlmostEqual(a, b)
assertAlmostEquals(a, b)
failIfAlmostEqual(a, b)
assertNotAlmostEquals(a, b)
-
basestring
¶ Convertit une
basestring
enstr
.
-
buffer
¶ Convertit un
buffer
enmemoryview
. Ce correcteur est optionnel car l’APImemoryview
est similaire mais pas exactement pareil que celle debuffer
.
-
dict
¶ Fixe les méthodes d’itération sur les dictionnaires.
dict.iteritems()
est converti endict.items()
,dict.iterkeys()
endict.keys()
etdict.itervalues()
endict.values()
. Similarly,dict.viewitems()
,dict.viewkeys()
etdict.viewvalues()
sont convertis respectivement endict.items()
,dict.keys()
etdict.values()
. Il encapsule également les usages existants dedict.items()
,dict.keys()
etdict.values()
dans un appel àlist
.
-
except
¶ Convertit
except X, T
enexcept X as T
.
-
execfile
¶ Supprime l’usage de
execfile()
. L’argument deexecfile()
est encapsulé dans des appels àopen()
,compile()
etexec()
.
-
exitfunc
¶ Change l’affectation de
sys.exitfunc
pour utiliser le moduleatexit
.
-
funcattrs
¶ Fixe les attributs de fonction ayant été renommés. Par exemple,
my_function.func_closure
est converti enmy_function.__closure__
.
-
future
¶ Supprime les instructions
from __future__ import new_feature
.
-
getcwdu
¶ Renomme
os.getcwdu()
enos.getcwd()
.
-
has_key
¶ Change
dict.has_key(key)
enkey in dict
.
-
idioms
¶ Ce correcteur optionnel effectue plusieurs transformations rendant le code Python plus idiomatique. Les comparaisons de types telles que
type(x) is SomeClass
ettype(x) == SomeClass
sont converties enisinstance(x, SomeClass)
.while 1
devientwhile True
. Ce correcteur essaye aussi d’utilisersorted()
aux endroits appropriés. Par exemple, ce blocL = list(some_iterable) L.sort()
est transformé en :
L = sorted(some_iterable)
-
import
¶ Détecte les imports voisins et les convertis en imports relatifs.
-
imports
¶ Gère les renommages de modules dans la bibliothèque standard.
-
imports2
¶ Gères d’autres renommages de modules dans la bibliothèque standard. Il est distinct de
imports
seulement en raison de limitations techniques.
-
input
¶ Convertit
input(prompt)
eneval(input(prompt))
.
-
isinstance
¶ Fixes duplicate types in the second argument of
isinstance()
. For example,isinstance(x, (int, int))
is converted toisinstance(x, (int))
.
-
itertools_imports
¶ Supprime les imports de
itertools.ifilter()
,itertools.izip()
etitertools.imap()
. Les imports deitertools.ifilterfalse()
sont aussi changés enitertools.filterfalse()
.
-
itertools
¶ Change l’usage de
itertools.ifilter()
,itertools.izip()
etitertools.imap()
en leurs équivalents intégrés.itertools.ifilterfalse()
est changé enitertools.filterfalse()
.
-
map
¶ Encapsule
map()
dans un appel àlist
. Change aussimap(None, x)
enlist(x)
. L’usage defrom future_builtins import map
désactive ce correcteur.
-
metaclass
¶ Convertit l’ancienne syntaxe de métaclasse (
__metaclass__ = Meta
dans le corps de la classe) à la nouvelle (class X(metaclasse=Meta)
).
-
methodattrs
¶ Fixe les anciens noms d’attributs de méthodes. Par exemple,
meth.im_func
est converti enmeth.__func__
.
-
ne
¶ Convertit l’ancienne syntaxe d’inégalité,
<>
, en!=
.
-
next
¶ Converts the use of iterator’s
next()
methods to thenext()
function. It also renamesnext()
methods to__next__()
.
-
nonzero
¶ Renomme
__nonzero__()
en__bool__()
.
-
numliterals
¶ Convertit les nombres écrits littéralement en octal dans leur nouvelle syntaxe.
-
paren
¶ Ajoute des parenthèses supplémentaires lorsqu’elles sont nécessaires dans les listes en compréhension. Par exemple,
[x for x in 1, 2]
devient[x for x in (1, 2)]
.
-
raise
¶ Converts
raise E, V
toraise E(V)
, andraise E, V, T
toraise E(V).with_traceback(T)
. IfE
is a tuple, the translation will be incorrect because substituting tuples for exceptions has been removed in Python 3.
-
raw_input
¶ Convertit
raw_input()
eninput()
.
-
reduce
¶ Gère le déplacement de
reduce()
àfunctools.reduce()
.
-
renames
¶ Change
sys.maxint
ensys.maxsize
.
-
set_literal
¶ Remplace l’usage du constructeur de
set
par les ensembles littéraux. Ce correcteur est optionnel.
-
standarderror
¶ Renomme
StandardError
enException
.
-
sys_exc
¶ Change les
sys.exc_value
,sys.exc_type
,sys.exc_traceback
dépréciés ensys.exc_info()
.
-
throw
¶ Fixe le changement de l’API dans la méthode
throw()
du générateur.
-
tuple_params
¶ Supprime la décompression implicite des paramètres d’un tuple. Ce correcteur ajoute des variables temporaires.
-
ws_comma
¶ Supprime l’espace excédentaire des éléments séparés par des virgules. Ce correcteur est optionnel.
-
xrange
¶ Renomme la fonction
xrange()
enrange()
et encapsule les appels à la fonctionrange()
avec des appels àlist
.
-
xreadlines
¶ Change
for x in file.xreadlines()
enfor x in file
.