PEP 215 – String Interpolation
- Autor:
- Ka-Ping Yee <ping at zesty.ca>
- Status:
- Abgelöst
- Typ:
- Standards Track
- Erstellt:
- 24-Jul-2000
- Python-Version:
- 2.1
- Post-History:
- Ersetzt-Durch:
- 292
Inhaltsverzeichnis
Zusammenfassung
Dieses Dokument schlägt eine String-Interpolationsfunktion für Python vor, um einfachere String-Formatierungen zu ermöglichen. Die vorgeschlagene Syntaxänderung ist die Einführung eines „$“-Präfixes, das die Sonderinterpretation des „$“-Zeichens innerhalb eines Strings auslöst, in einer Weise, die an die Variablenerweiterung in Unix-Shells, awk, Perl oder Tcl erinnert.
Urheberrecht
Dieses Dokument ist gemeinfrei.
Spezifikation
Strings können mit einem „$“-Präfix versehen werden, das vor dem führenden Anführungszeichen (einfach, doppelt oder dreifach) und vor allen anderen String-Präfixen („r“ oder „u“) steht. Ein solcher String wird nach der normalen Interpretation von Backslash-Escapes in seinem Inhalt auf Interpolation verarbeitet. Die Verarbeitung erfolgt unmittelbar bevor der String auf den Wertstapel gelegt wird, jedes Mal, wenn der String auf den Stapel gelegt wird. Kurz gesagt, Python verhält sich genau so, als ob „$“ ein unärer Operator wäre, der auf den String angewendet wird. Die durchgeführte Operation ist wie folgt:
Der String wird von Anfang bis Ende nach dem „$“-Zeichen durchsucht (\x24 in 8-Bit-Strings oder \u0024 in Unicode-Strings). Wenn keine „$“-Zeichen vorhanden sind, wird der String unverändert zurückgegeben.
Jedes „$“, das im String gefunden wird und von einer der beiden unten beschriebenen Ausdrucksarten gefolgt wird, wird durch den Wert des Ausdrucks ersetzt, wie er in den aktuellen Namespaces ausgewertet wird. Der Wert wird mit str() konvertiert, wenn der enthaltende String ein 8-Bit-String ist, oder mit unicode(), wenn es sich um einen Unicode-String handelt.
- Ein Python-Bezeichner, gefolgt von beliebig vielen Trailers, wobei ein Trailer besteht aus: - einem Punkt und einem Bezeichner, - einem in eckige Klammern eingeschlossenen Ausdruck, oder - einer in Klammern eingeschlossenen Argumentliste (Dies ist genau das Muster, das im Python-Grammatik durch „
NAME trailer*“ ausgedrückt wird, unter Verwendung der Definitionen inGrammar/Grammar.) - Jeder vollständige Python-Ausdruck, der in geschweifte Klammern eingeschlossen ist.
Zwei Dollarzeichen („$$“) werden durch ein einzelnes „$“ ersetzt.
Beispiele
Hier ist ein Beispiel für eine interaktive Sitzung, die das erwartete Verhalten dieser Funktion zeigt.
>>> a, b = 5, 6
>>> print $'a = $a, b = $b'
a = 5, b = 6
>>> $u'uni${a}ode'
u'uni5ode'
>>> print $'\$a'
5
>>> print $r'\$a'
\5
>>> print $'$$$a.$b'
$5.6
>>> print $'a + b = ${a + b}'
a + b = 11
>>> import sys
>>> print $'References to $a: $sys.getrefcount(a)'
References to 5: 15
>>> print $"sys = $sys, sys = $sys.modules['sys']"
sys = <module 'sys' (built-in)>, sys = <module 'sys' (built-in)>
>>> print $'BDFL = $sys.copyright.split()[4].upper()'
BDFL = GUIDO
Diskussion
„$“ wird als Interpolationszeichen innerhalb des Strings gewählt, um die Vertrautheit zu wahren, da es in vielen anderen Sprachen und Kontexten bereits für diesen Zweck verwendet wird.
Es ist dann natürlich, „$“ als Präfix zu wählen, da es eine Merkhilfe für das Interpolationszeichen ist.
Trailers sind erlaubt, um diesem Interpolationsmechanismus noch mehr Leistung zu verleihen als die Interpolation in den meisten anderen Sprachen, während der zu interpolierende Ausdruck klar sichtbar und frei von geschweiften Klammern bleibt.
„$“ funktioniert wie ein Operator und könnte als Operator implementiert werden, aber das verhindert die Compile-Zeit-Optimierung und birgt Sicherheitsrisiken. Daher ist es nur als String-Präfix erlaubt.
Sicherheitsaspekte
„$“ hat die Macht, zu evaluieren, aber nur ein Literal zu evaluieren. Wie hier beschrieben (ein String-Präfix anstelle eines Operators), führt es keine neuen Sicherheitsprobleme ein, da die zu evaluierenden Ausdrücke buchstäblich im Code vorhanden sein müssen.
Implementierung
Das Modul Itpl unter [1] bietet einen Prototyp dieser Funktion. Es verwendet das Modul tokenize, um das Ende eines zu interpolierenden Ausdrucks zu finden, und ruft dann eval() für den Ausdruck auf, jedes Mal, wenn ein Wert benötigt wird. Im Prototyp wird der Ausdruck jedes Mal, wenn er ausgewertet wird, neu geparst und kompiliert.
Als Optimierung könnten interpolierte Strings direkt in den entsprechenden Bytecode kompiliert werden; das heißt,
$'a = $a, b = $b'
könnte kompiliert werden, als ob es der Ausdruck wäre
('a = ' + str(a) + ', b = ' + str(b))
damit er nur einmal kompiliert werden muss.
Referenzen
Quelle: https://github.com/python/peps/blob/main/peps/pep-0215.rst
Zuletzt geändert: 2024-04-14 13:35:25 GMT