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                                    1
'secret'
>>> "%(pwd)s is not a good password for %(uid)s" % params 2
'secret is not a good password for sa'
>>> "%(database)s of mind, %(database)s of body" % params 3
'master of mind, master of body'
1 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.
2 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.
3 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

    def handle_comment(self, text):        
        self.pieces.append("<!--%(text)s-->" % locals()) 1
1 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]) 1
        self.pieces.append("<%(tag)s%(strattrs)s>" % locals())                      2
1 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 :
  1. Supposez que attrs vaut [('href', 'index.html'), ('title', 'Go to home page')].
  2. Durant la première étape de la list comprehension, la clé (key) sera 'href' et la valeur (value) 'index.html'.
  3. Le formatage de chaîne ' %s="%s"' % (key, value) donnera ' href="index.html"'. Cette chaîne devient le premier élément de la valeur de retour de la list comprehension.
  4. Durant la seconde étape, key sera 'title' et value 'Go to home page'.
  5. Le formatage de chaîne donnera ' title="Go to home page"'.
  6. 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.html" title="Go to home page"'.
2 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.html" title="Go to home page">' et c’est ce qui sera ajouté à self.pieces.
Important
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.