web-dev-qa-db-fra.com

formater les chaînes et les 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 ça 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 mauvais ordre

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

Cela fonctionne ...

et il imprime '20 10'

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

65
bkmagnetron

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

Les arguments de mot-clé sont comme des clés dans un dictionnaire; l'ordre n'a pas d'importance, car ils sont comparés à un name .

Si vous vouliez faire correspondre des arguments positional , utilisez des nombres:

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

Dans Python 2.7 et versions ultérieures, vous pouvez omettre les numéros; les champs de remplacement {} Sont ensuite numérotés automatiquement dans l'ordre d'apparition dans la chaîne de mise en forme:

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

La chaîne de mise en forme peut correspondre aux deux arguments de mot clé positionnel et , et peut être utilisée plusieurs fois:

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

Citant à partir de la spécification de chaîne de formatage :

Le field_name lui-même commence par un arg_name qui est un nombre ou un mot clé . S'il s'agit d'un nombre, il fait référence à un argument de position et s'il s'agit d'un mot clé, il se réfère à un argument de mot clé nommé.

L'accent est à moi.

Si vous créez une chaîne de formatage volumineuse, il est souvent beaucoup plus lisible et facile à gérer que d'utiliser des champs de remplacement nommés. Vous n'avez donc pas à compter les arguments et à déterminer quel argument se trouve où dans la chaîne résultante.

Vous pouvez également utiliser la syntaxe d'appel **keywords Pour appliquer un dictionnaire existant à un format, ce qui facilite la conversion d'un fichier CSV en sortie mise en forme:

import csv

fields = ('category', 'code', 'price', 'description', 'link', 'picture', 'plans')
table_row = '''\
    <tr>
      <td><img src="{picture}"></td>
      <td><a href="{link}">{description}</a> ({price:.2f})</td>
   </tr>
'''

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, picture, link, description et price sont tous des clés du dictionnaire row, et il s’agit de beaucoup plus facile pour voir ce qui se passe lorsque j'applique le row à la chaîne de formatage.

104
Martijn Pieters