formater des chaînes et des arguments nommés dans Python

Cas 1:

"{arg1} {arg2}".format (10, 20) 

Cela donnera KeyError: 'arg1' parce que je n’ai pas passé les arguments nommés.

Cas 2:

 "{arg1} {arg2}".format(arg1 = 10, arg2 = 20) 

Maintenant, cela fonctionnera correctement car j’ai passé les arguments nommés. Et il imprime '10 20'

Cas 3:

Et, si je passe un mauvais nom, il affichera KeyError: 'arg1'

  "{arg1} {arg2}".format(wrong = 10, arg2 = 20) 

Mais,

Cas 4:

Si je passe les arguments nommés dans le mauvais ordre

 "{arg1} {arg2}".format(arg2 = 10, arg1 = 20) 

Ça marche…

et il imprime '20 10'

Ma question est de savoir pourquoi cela fonctionne et quelle est l’utilisation des arguments nommés dans ce cas.

Les champs de remplacement nommés (les parties {...} dans une chaîne de format ) correspondent aux arguments des mots-clés à la méthode .format() et non aux arguments de position .

Les arguments de mot clé sont comme les clés d’un dictionnaire. l’ordre n’a pas d’importance, car ils sont comparés à un nom .

Si vous souhaitez faire correspondre les arguments positionnels , utilisez des nombres:

 "{0} {1}".format(10, 20) 

Dans Python 2.7 et versions ultérieures, vous pouvez omettre les nombres; les champs de remplacement {} sont ensuite numérotés automatiquement par ordre d’apparition dans la chaîne de formatage:

 "{} {}".format(10, 20) 

La chaîne de formatage peut correspondre aux arguments positionnels et aux mots clés et peut utiliser des arguments plusieurs fois:

 "{1} {ham} {0} {foo} {1}".format(10, 20, foo='bar', ham='spam') 

Citant la spécification de la chaîne de format :

Le nom du champ lui-même commence par un nom_arg qui est un nombre ou un mot-clé . S’il s’agit d’un nombre, il fait référence à un argument positionnel, et s’il s’agit d’un mot clé, il fait référence à un argument de mot clé nommé.

Accent mis à moi.

Si vous créez une chaîne de formatage volumineuse, il est souvent beaucoup plus lisible et maintenable de pouvoir utiliser les champs de remplacement nommés, vous n’avez donc pas à continuer à compter les arguments et à déterminer l’argument dans la chaîne résultante.

Vous pouvez également utiliser la syntaxe d’appel **keywords**keywords pour appliquer un dictionnaire existant à un format, ce qui facilite la conversion d’un fichier CSV en sortie formatée:

 import csv fields = ('category', 'code', 'price', 'description', 'link', 'picture', 'plans') table_row = '''\   {description} ({price:.2f})  ''' with open(filename, 'rb') as infile: reader = csv.DictReader(infile, fieldnames=fields, delimiter='\t') for row in reader: row['price'] = float(row['price']) # needed to make `.2f` formatting work print table_row.format(**row) 

Ici, l’ picture , le link , la description et le price sont tous des clés du dictionnaire de row , et il est beaucoup plus facile de voir ce qui se passe lorsque j’applique la row à la chaîne de formatage.