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.