String-Formatierung benannter Parameter?

134

Ich weiß, dass es eine wirklich einfache Frage ist, aber ich habe keine Ahnung, wie ich sie googeln soll.

wie kann ich

print '<a href="%s">%s</a>' % (my_url)

Das wird also my_urlzweimal verwendet? Ich nehme an, ich muss das "benennen" %sund dann ein Diktat in den Parametern verwenden, bin mir aber nicht sicher, welche Syntax richtig ist?


Nur zu my_urlIhrer Information , ich bin mir bewusst, dass ich nur zweimal in den Parametern verwenden kann, aber das ist nicht der Punkt :)

mpen
quelle
Der Titel der Frage ist etwas irreführend. Dies hat nichts mit der print-Anweisung zu tun, sondern nur mit der Funktionsweise der String-Interpolation.
Greg Ball
Wenn Sie keine Ahnung haben, wie Sie es googeln sollen, klicken Sie hier, um die Suche zu verwenden: python.org/doc . Es ist aus einem wichtigen Grund besser als Google.
S.Lott
@ S.Lott Das ist wirklich hilfreich / s
mpen

Antworten:

79

In Python 2.6+ und Python 3 können Sie die neuere Formatierungsmethode für Zeichenfolgen verwenden.

print('<a href="{0}">{0}</a>'.format(my_url))

das erspart Ihnen das Wiederholen des Arguments, oder

print('<a href="{url}">{url}</a>'.format(url=my_url))

wenn Sie benannte Parameter möchten.

print('<a href="{}">{}</a>'.format(my_url, my_url))

Dies ist streng positionell und nur mit dem Vorbehalt verbunden, dass format () -Argumente Python-Regeln folgen, bei denen unbenannte Argumente zuerst kommen müssen, gefolgt von benannten Argumenten, gefolgt von * args (eine Sequenz wie Liste oder Tupel) und dann * kwargs (ein Diktat) mit Strings verschlüsselt, wenn Sie wissen, was für Sie gut ist). Die Interpolationspunkte werden zuerst durch Ersetzen der benannten Werte an ihren Beschriftungen und dann durch Positionieren von den verbleibenden Werten bestimmt. Sie können dies also auch tun ...

print('<a href="{not_my_url}">{}</a>'.format(my_url, my_url, not_my_url=her_url))

Aber nicht das ...

print('<a href="{not_my_url}">{}</a>'.format(my_url, not_my_url=her_url, my_url))
Greg Ball
quelle
Es ist schön zu sehen, wie sich der Einfluss von ++ auf #
cod3monk3y am
3
Die obige Methode ist jedoch nicht für die Formatierung benannter Zeichenfolgen vorgesehen. Dies ist die Formatierung von Positionszeichenfolgen. Das beantwortet die Frage also nicht wirklich.
Jaapz
Das "literal {arg1}".format(arg1="arg!")genannte Format funktioniert mit Python 3.5, während der Terser f"literal {arg1}"eine neuere Innovation in Python 3.6 oder neuer, AFAIK, ist.
MarkHu
218
print '<a href="%(url)s">%(url)s</a>' % {'url': my_url}
Ignacio Vazquez-Abrams
quelle
3
Ich ziehe es vor, das Diktat mit kwargs zu erstellen:'<a href="%(url)s">%(url)s</a>' % dict(url=my_url)
schlamar
11
Ich frage mich, warum Sie diesen Schmlamar bevorzugen? Ich hätte nicht ohne weiteres gewusst, was das bedeutet, verglichen mit der normalen Erklärung eines Diktats, das das OP verwendet ...
GreenAsJade
1
Die Dokumentation sagt nicht, wann dies eingeführt wurde, daher ist es wahrscheinlich in allen Python 2-Versionen.
Evgeni Sergeev
2
Verwenden Sie format (), wenn Sie können, es funktioniert besser und an mehr Stellen. Verwenden Sie%, wenn Sie müssen.
Uchuugaka
39

Lösung in Python 3.6+

Python 3.6 führt die Formatierung von Literalzeichenfolgen ein , sodass Sie die benannten Parameter formatieren können , ohne Ihre benannten Parameter außerhalb der Zeichenfolge zu wiederholen:

print(f'<a href="{my_url:s}">{my_url:s}</a>')

Dies wird ausgewertet my_url. Wenn es nicht definiert ist, erhalten Sie eine NameError. Stattdessen my_urlkönnen Sie stattdessen einen beliebigen Python-Ausdruck schreiben, sofern dieser als Zeichenfolge ausgewertet wird (aufgrund des :sFormatierungscodes). Wenn Sie eine Zeichenfolgendarstellung für das Ergebnis eines Ausdrucks wünschen, der möglicherweise keine Zeichenfolge ist, ersetzen Sie diese :sdurch eine !sreguläre vorliterale Zeichenfolgenformatierung.

Ausführliche Informationen zur Formatierung von Literalzeichenfolgen finden Sie in PEP 498 , wo es erstmals eingeführt wurde.

gerrit
quelle
1
Dieser PEP scheint nicht alle Formatierer abzudecken. Ich denke, sie sind die gleichen wie str.format, das hier dokumentiert ist: docs.python.org/3.4/library/string.html#formatstrings
mpen
6

Sie werden von der Syntax abhängig sein.

Auch EcmaScript-Entwickler, C # 6.0, kennen diese Syntax.

In [1]: print '{firstname} {lastname}'.format(firstname='Mehmet', lastname='Ağa')
Mehmet Ağa

In [2]: print '{firstname} {lastname}'.format(**dict(firstname='Mehmet', lastname='Ağa'))
Mehmet Ağa
Guneysos
quelle
5

Zum Erstellen von HTML-Seiten möchten Sie eine Vorlagen-Engine verwenden, keine einfache Zeichenfolgeninterpolation.

Mike Graham
quelle
2
Die Vorlagen-Engine von Django kann sich auch als ideales Tool für die von Ihnen erstellten E-Mails erweisen.
Mike Graham
6
Was hindert Sie daran, eine Django-Vorlage zu verwenden, um einen E-Mail-Text mit seiner render()Methode zu generieren ? Nichts sagt, dass Sie die Vorlagenausgabe füttern müssen HttpResponse(). Django ist peinlich vielseitig.
Mike DeSimone
1
@Mike: Ich dachte, Django hätte vielleicht auch eine Lösung dafür, aber ich hatte sie noch nicht gefunden: p Ich werde meine E-Mails dann wahrscheinlich in Vorlagen verschieben! Vielen Dank. Vielleicht bin ich verspätet, aber ich habe festgestellt, dass es in einigen Bereichen ziemlich starr ist.
Mpen
2
@ zufällige Leute, die diese Kommentare lesen: Weitere Informationen
mpen
1
Zum Kommentieren von Fragen möchten Sie Kommentare verwenden, keine Antworten.
Suriv
2

Neben dem Wörterbuch kann es nützlich sein, das folgende Format zu kennen:

print '<a href="%s">%s</a>' % (my_url, my_url)

Hier ist es ein bisschen redundant, und die Wörterbuchmethode ist sicherlich weniger fehleranfällig, wenn der Code geändert wird, aber es ist immer noch möglich, Tupel für mehrere Einfügungen zu verwenden. Das erste %sersetzt das erste Element im Tupel, das zweite %sdas zweite Element im Tupel usw. für jedes Element im Tupel.

Ponkadoodle
quelle
Ich habe gerade einem Typen gesagt, dass er dies vorgeschlagen hat :) Er hat seinen Beitrag gelöscht. Ich fühle mich jetzt irgendwie schlecht. Ja, ich bin mir bewusst, dass ich das kann, aber es war einfach nicht das, wonach ich gesucht habe. Wie Sie sagten, ist es redundant und my_urleigentlich ein Funktionsaufruf, den ich nicht zweimal auswerten möchte. Zweimal ist nicht so schlimm, aber es hätte einfach 20 Mal sein können :)
mpen
5
Ich dachte, ich würde meine behalten, nur für den Fall, dass es jemand anderem hilft. Nun, der Wörterbuchweg ist wahrscheinlich der beste Weg. (get_my_url(), )*20Ruft die Funktion aus Redundanzgründen nur einmal auf und dupliziert sie 20 Mal.
Ponkadoodle