web-dev-qa-db-de.com

Formatieren Sie Zeichenfolgen und benannte Argumente in Python

Fall 1:

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

Es wird KeyError: 'arg1' weil ich die genannten Argumente nicht übergeben habe.

Fall 2:

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

Jetzt wird es richtig funktionieren, da ich die genannten Argumente übergeben habe. Und es druckt '10 20'

Fall 3:

Und wenn ich einen falschen Namen gebe, wird KeyError: 'arg1'

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

Aber,

Fall 4:

Übergebe ich die genannten Argumente in falsche Reihenfolge

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

Es funktioniert ...

und es druckt '20 10'

Meine Frage ist, warum es funktioniert und wofür benannte Argumente in diesem Fall verwendet wird.

65
bkmagnetron

Benannte Ersetzungsfelder (die {...} - Teile in einer Formatzeichenfolge ) stimmen mit Schlüsselwortargumenten mit der .format() -Methode überein und nicht Positionsargumente.

Schlüsselwortargumente sind wie Schlüssel in einem Wörterbuch. Die Reihenfolge spielt keine Rolle, da sie mit einem name abgeglichen werden.

Wenn Sie mit positional Argumenten abgleichen möchten, verwenden Sie die folgenden Zahlen:

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

In Python 2.7 und höher können Sie die Zahlen weglassen; die Ersetzungsfelder {} Werden dann in der Reihenfolge ihres Auftretens in der Formatierungszeichenfolge automatisch nummeriert:

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

Die Formatierungszeichenfolge kann mit beiden positionellen und Schlüsselwortargumenten übereinstimmen und Argumente mehrfach verwenden:

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

Zitat aus dem Format String Spezifikation :

Das field_name selbst beginnt mit einem arg_name, das entweder eine Zahl oder ein Schlüsselwort ist. Wenn es sich um eine Zahl handelt, handelt es sich um ein Positionsargument. Wenn es sich um ein Schlüsselwort handelt, handelt es sich um ein benanntes Schlüsselwortargument.

Betonung meiner.

Wenn Sie eine große Formatierungszeichenfolge erstellen, ist die Verwendung von benannten Ersetzungsfeldern häufig besser lesbar und wartbar, sodass Sie nicht mehr die Argumente zählen und herausfinden müssen, welches Argument wohin in die resultierende Zeichenfolge fließt.

Sie können auch die **keywords - Aufrufsyntax verwenden, um ein vorhandenes Wörterbuch auf ein Format anzuwenden. Auf diese Weise können Sie eine CSV-Datei auf einfache Weise in eine formatierte Ausgabe umwandeln:

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)

Hier sind picture, link, description und price alle Schlüssel im Wörterbuch row, und es ist much einfacher um zu sehen, was passiert, wenn ich row auf die Formatierungszeichenfolge anwende.

104
Martijn Pieters