Comme Python 3.0 et 3.1 sont en fin de vie et que personne ne les utilise, vous pouvez et devez utiliser str.format_map(mapping)
(Python 3.2+):
Similaire à str.format(**mapping)
, sauf que le mappage est utilisé directement et non copié dans adict
. Ceci est utile si, par exemple, le mappage est une dict
sous - classe.
Cela signifie que vous pouvez utiliser par exemple un defaultdict
qui définirait (et renverrait) une valeur par défaut pour les clés manquantes:
>>> from collections import defaultdict
>>> vals = defaultdict(lambda: '<unset>', {'bar': 'baz'})
>>> 'foo is {foo} and bar is {bar}'.format_map(vals)
'foo is <unset> and bar is baz'
Même si le mappage fourni est une dict
, et non une sous-classe, ce serait probablement encore un peu plus rapide.
La différence n'est pas grande cependant, étant donné
>>> d = dict(foo='x', bar='y', baz='z')
puis
>>> 'foo is {foo}, bar is {bar} and baz is {baz}'.format_map(d)
est environ 10 ns (2%) plus rapide que
>>> 'foo is {foo}, bar is {bar} and baz is {baz}'.format(**d)
sur mon Python 3.4.3. La différence serait probablement plus grande car il y a plus de clés dans le dictionnaire, et
Notez que le langage de format est bien plus flexible que cela cependant; ils peuvent contenir des expressions indexées, des accès aux attributs, etc., vous pouvez donc formater un objet entier ou 2 d'entre eux:
>>> p1 = {'latitude':41.123,'longitude':71.091}
>>> p2 = {'latitude':56.456,'longitude':23.456}
>>> '{0[latitude]} {0[longitude]} - {1[latitude]} {1[longitude]}'.format(p1, p2)
'41.123 71.091 - 56.456 23.456'
À partir de 3.6, vous pouvez également utiliser les chaînes interpolées:
>>> f'lat:{p1["latitude"]} lng:{p1["longitude"]}'
'lat:41.123 lng:71.091'
Vous devez juste vous rappeler d'utiliser les autres caractères de guillemet dans les guillemets imbriqués. Un autre avantage de cette approche est qu'elle est beaucoup plus rapide que d' appeler une méthode de formatage.