8.6. Formatage de chaînes à l’aide d’un dictionnaire
Pourquoi avoir appris locals et globals ? Pour apprendre le formatage de chaînes à l'aide d'un dictionnaire. Comme vous vous le rappelez, le formatage de
chaînes permet d’insérer facilement des valeurs dans des chaînes.
Les valeurs sont énumérées dans un tuple et insérées dans l’ordre dans
la chaîne à la place de chaque marqueur de formatage. Bien que ce soit
efficace, cela ne donne pas le code le plus simple à lire, surtout quand
de multiples valeurs sont insérées. Vous ne pouvez pas simplement lire
la chaîne en une fois pour comprendre ce que le résultat va être, vous
devez constamment passer de la chaîne au tuple.
Il existe une technique de formatage de chaînes alternative
utilisant un dictionnaire au lieu de valeurs stockées dans un
tuple.
Exemple 8.13. Présentation du formatage de chaînes à l’aide d’un
dictionnaire
>>> params = {"server":"mpilgrim", "database":"master", "uid":"sa", "pwd":"secret"}>>> "%(pwd)s" % params'secret'>>> "%(pwd)s is not a good password for %(uid)s" % params'secret is not a good password for sa'>>> "%(database)s of mind, %(database)s of body" % params'master of mind, master of body'
Au lieu d’un tuple de valeurs explicites, ce type de
formatage de chaînes utilise un dictionnaire,
params. Et au lieu d’un simple marqueur
%s dans la chaîne, le marqueur contient un nom
entre parenthèses. Ce nom est utilisé comme clé dans le
dictionnaire params et la valeur
correspondante, secret, est substituée au
marqueur %(pwd)s.
Le formatage à l’aide d’un dictionnaire fonctionne avec
n’importe quel nombre de clés nommées. Chaque clé doit exister
dans le dictionnaire, sinon le formatage échouera avec une erreur
KeyError.
Vous pouvez même insérer la même clé plusieurs fois, chaque
occurrence sera remplacée avec la même valeur.
Quand utiliser le formatage à l’aide d’un
dictionnaire ? Il est un peu exagéré de mettre en place un dictionnaire
de clés et de valeurs simplement pour formater une ligne, c’est en fait
plus approprié lorsque vous avez déjà un dictionnaire. Comme par exemple
locals.
Exemple 8.14. Formatage à l’aide d’un dictionnaire dans BaseHTMLProcessor.py
L’utilisation de la fonction prédéfinie
locals est le cas le plus commun d’emploi du
formatage à l’aide d’un dictionnaire. Cela vous permet d’utiliser
les noms des variables locales dans votre chaîne (dans ce cas,
text, qui a été passé en argument à la méthode
de classe) et chaque variable sera remplacée par sa valeur. Si
text est 'Begin page
footer', le formatage de chaîne
"<!--%(text)s-->" % locals() se traduira
par la chaîne '<!--Begin page
footer-->'.
Exemple 8.15. Autres exemples de formatage à l’aide d’un dictionnaire
def unknown_starttag(self, tag, attrs):
strattrs = "".join([' %s="%s"' % (key, value) for key, value in attrs])
self.pieces.append("<%(tag)s%(strattrs)s>" % locals())
Lorsque cette méthode est appelée, attrs
est une liste de tuples clé/valeur, comme les items (éléments) d’un
dictionnaire, ce qui signifie que nous pouvons utiliser
l’assignement
multiple pour la parcourir. Cela devrait être un motif
familier maintenant, mais il se passe beaucoup de choses ici,
détaillons-les :
Supposez que attrs vaut
[('href', 'index.php'), ('title', 'Go to home
page')].
Durant la première étape de la list
comprehension, la clé (key)
sera 'href' et la valeur
(value)
'index.php'.
Le formatage de chaîne ' %s="%s"' % (key, value) donnera
' href="index.php"'. Cette chaîne
devient le premier élément de la valeur de retour de la
list comprehension.
Durant la seconde étape, key sera
'title' et value'Go to home page'.
Le formatage de chaîne donnera ' title="Go to
home page"'.
La list comprehension
retourne une liste de ces deux chaînes et
strattrs joindra les deux éléments de cette
liste pour former ' href="index.php" title="Go
to home page"'.
Maintenant, en utilisant le formatage à l’aide d’un
dictionnaire, nous insérons la valeur de tag et
de strattrs dans une chaîne. Donc si
tag vaut 'a', le résultat
final sera '<a href="index.php" title="Go to home
page">' et c’est ce qui sera ajouté à
self.pieces.
L’utilisation du formatage de chaîne à l’aide d’un dictionnaire
avec locals est une manière pratique de rendre
des expressions de formatage complexes plus lisibles, mais elle a un
prix. Il y a une petite baisse de performance due à l’appel de
locals, puisque locals
effectue une copie de l’espace de noms local.