Fall 1:
"{arg1} {arg2}".format(10, 20)
Es wird geben, KeyError: 'arg1'
weil ich die genannten Argumente nicht übergeben habe.
Fall 2:
"{arg1} {arg2}".format(arg1=10, arg2=20)
Jetzt wird es richtig funktionieren, weil ich die genannten Argumente übergeben habe. Und es druckt'10 20'
Fall 3:
Und wenn ich einen falschen Namen übergebe, wird dies angezeigt KeyError: 'arg1'
"{arg1} {arg2}".format(wrong=10, arg2=20)
Aber,
Fall 4:
Wenn ich die genannten Argumente in falscher Reihenfolge übergebe
"{arg1} {arg2}".format(arg2=10, arg1=20)
Es klappt...
und es druckt '20 10'
Meine Frage ist, warum es funktioniert und wie benannte Argumente in diesem Fall verwendet werden.
python
string
arguments
string-formatting
bkmagnetron
quelle
quelle
Antworten:
Benannte Ersetzungsfelder (die
{...}
Teile in einer Formatzeichenfolge ) stimmen mit Schlüsselwortargumenten der.format()
Methode und nicht mit Positionsargumenten überein .Schlüsselwortargumente sind wie Schlüssel in einem Wörterbuch. Reihenfolge spielt keine Rolle, da sie mit einem Namen abgeglichen werden .
Wenn Sie mit Positionsargumenten übereinstimmen möchten, verwenden Sie Zahlen:
"{0} {1}".format(10, 20)
In Python 2.7 und höher können Sie die Zahlen weglassen. Die
{}
Ersatzfelder werden dann in der Reihenfolge ihres Auftretens in der Formatierungszeichenfolge automatisch nummeriert:"{} {}".format(10, 20)
Die Formatierungszeichenfolge kann sowohl mit Positions- als auch mit Schlüsselwortargumenten übereinstimmen und Argumente mehrfach verwenden:
"{1} {ham} {0} {foo} {1}".format(10, 20, foo='bar', ham='spam')
Zitiert aus der Format - String - Spezifikation :
Hervorhebung von mir.
Wenn Sie eine große Formatierungszeichenfolge erstellen, ist es häufig viel besser lesbar und wartbar, benannte Ersatzfelder zu verwenden, sodass Sie die Argumente nicht ständig zählen und herausfinden müssen, welches Argument wohin in die resultierende Zeichenfolge fließt.
Sie können auch die
**keywords
aufrufende Syntax verwenden, um ein vorhandenes Wörterbuch auf ein Format anzuwenden, sodass Sie eine CSV-Datei einfach in eine formatierte Ausgabe umwandeln können: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
picture
,link
,description
undprice
sind alle Schlüssel imrow
Wörterbuch, und es ist viel einfacher zu sehen , was passiert , wenn ich die Anwendungrow
auf die Formatierung Zeichenfolge.quelle
Zusätzliche Vorteile sind
"{foo} {foo}".format(foo="bar")
gibt 'Bar Bar'Beachten Sie, dass Sie zusätzliche Argumente angeben können, ohne Fehler zu verursachen. All dies ist besonders nützlich, wenn
Z.B:
>d = {"foo":"bar", "test":"case", "dead":"beef"} >print("I need foo ({foo}) and dead ({dead})".format(**d)) >print("I need test ({test}) and foo ({foo}) and then test again ({test})".format(**d))
I need foo (bar) and dead (beef) I need test (case) and foo (bar) and then test again (case)
quelle
format
an der nicht alle Schlüssel tatsächlich in der Formatzeichenfolge erscheinen. Vielen Dank für den Hinweis!