string.templatelib — Unterstützung für Template-Strings¶
Dieses Modul bietet Unterstützung für Template-Strings (t-Strings) gemäß PEP 750. Template-Strings werden mit dem Präfix t erstellt und ermöglichen den Zugriff sowohl auf die wörtlichen Zeichenkettenteile als auch auf die interpolierten Werte, bevor diese kombiniert werden.
Verfügbarkeit: Template-Strings werden auf den STM32-basierten OpenMV Cams nicht unterstützt. Sie sind nur auf den Alif- und i.MX RT-basierten OpenMV Cams verfügbar.
Klassen¶
- class string.templatelib.Template(*args)¶
Repräsentiert einen Template-String. Template-Objekte werden üblicherweise durch t-String-Syntax (
t"...") erstellt, können aber auch direkt über den Konstruktor erzeugt werden.- strings¶
Ein Tupel von String-Literalen, die zwischen Interpolationen erscheinen.
- interpolations¶
Ein Tupel von
Interpolation-Objekten, die die interpolierten Ausdrücke repräsentieren.
- values¶
Eine schreibgeschützte Eigenschaft, die ein Tupel mit dem
value-Attribut jeder Interpolation im Template zurückgibt.
- __iter__() Iterator¶
Iteriert über den Inhalt des Templates und liefert Zeichenkettenteile und
Interpolation-Objekte in der Reihenfolge, in der sie erscheinen. Leere Zeichenketten werden ausgelassen.
- __add__(other: Template) Template¶
Verkettet zwei Templates. Gibt ein neues
Templatezurück, das die Zeichenketten und Interpolationen beider Templates kombiniert.Die Verkettung von Templates mit
strist untersagt, um Mehrdeutigkeit darüber zu vermeiden, ob die Zeichenkette als Literal oder als Interpolation behandelt werden soll:t1 = t"Hello " t2 = t"World" result = t1 + t2 # Valid # TypeError: cannot concatenate str to Template result = t1 + "World"
- class string.templatelib.Interpolation(value: Any, expression: str = '', conversion: str | None = None, format_spec: str = '')¶
Repräsentiert einen interpolierten Ausdruck innerhalb eines Template-Strings. Alle Argumente können als Schlüsselwortargumente übergeben werden.
- value¶
Der ausgewertete Wert des interpolierten Ausdrucks.
- expression¶
Die Zeichenkettendarstellung des Ausdrucks, so wie er im Template-String erschien.
- conversion¶
Der Konvertierungs-Spezifizierer (
's'oder'r'), falls vorhanden, andernfallsNone. Beachten Sie, dass MicroPython die Konvertierung'a'nicht unterstützt.
- format_spec¶
Die Formatspezifikations-Zeichenkette, falls vorhanden, andernfalls eine leere Zeichenkette.
Template-String-Syntax¶
Template-Strings verwenden dieselbe Syntax wie f-Strings, jedoch mit einem t-Präfix:
name = "World"
template = t"Hello {name}!"
# Access template components
print(template.strings) # ('Hello ', '!')
print(template.values) # ('World',)
print(template.interpolations[0].expression) # 'name'
Konvertierungs-Spezifizierer¶
Template-Strings speichern Konvertierungs-Spezifizierer als Metadaten. Anders als bei f-Strings wird die Konvertierung nicht automatisch angewendet:
value = "test"
t = t"{value!r}"
# t.interpolations[0].value == "test" (not repr(value))
# t.interpolations[0].conversion == "r"
Der verarbeitende Code muss Konvertierungen bei Bedarf explizit anwenden.
Formatspezifikationen¶
Formatspezifikationen werden als Metadaten im Interpolation-Objekt gespeichert. Anders als bei f-Strings wird die Formatierung nicht automatisch angewendet:
pi = 3.14159
t = t"{pi:.2f}"
# t.interpolations[0].value == 3.14159 (not formatted)
# t.interpolations[0].format_spec == ".2f"
Gemäß PEP 750 ist der verarbeitende Code nicht verpflichtet, Formatspezifikationen zu verwenden, aber wenn sie vorhanden sind, sollten sie beachtet werden und nach Möglichkeit dem Verhalten von f-Strings entsprechen.
Debug-Format¶
Das Debug-Format {expr=} wird unterstützt:
x = 42
t = t"{x=}"
# t.strings == ("x=", "")
# t.interpolations[0].expression == "x"
# t.interpolations[0].conversion == "r"
Wichtig
Gemäß PEP 750 wenden Template-Strings, anders als f-Strings, Konvertierungen oder Formatspezifikationen nicht automatisch an. Dies ist beabsichtigt, damit der verarbeitende Code steuern kann, wie diese gehandhabt werden. Der verarbeitende Code muss diese Attribute explizit behandeln.
MicroPython stellt die eingebaute Funktion format() nicht bereit. Verwenden Sie stattdessen String-Formatierungsmethoden wie str.format().
Anwendungsbeispiel¶
Grundlegende Verarbeitung ohne Formatunterstützung:
def simple_process(template):
"""Simple template processing"""
parts = []
for item in template:
if isinstance(item, str):
parts.append(item)
else:
parts.append(str(item.value))
return "".join(parts)
Verarbeitung eines Templates mit Formatunterstützung:
from string.templatelib import Template, Interpolation
def convert(value, conversion):
"""Apply conversion specifier to value"""
if conversion == "r":
return repr(value)
elif conversion == "s":
return str(value)
return value
def process_template(template):
"""Process template with conversion and format support"""
result = []
for part in template:
if isinstance(part, str):
result.append(part)
else: # Interpolation
value = convert(part.value, part.conversion)
if part.format_spec:
# Apply format specification using str.format
value = ("{:" + part.format_spec + "}").format(value)
else:
value = str(value)
result.append(value)
return "".join(result)
pi = 3.14159
name = "Alice"
t = t"{name!r}: {pi:.2f}"
print(process_template(t))
# Output: "'Alice': 3.14"
# Other format specifications work too
value = 42
print(process_template(t"{value:>10}")) # " 42"
print(process_template(t"{value:04d}")) # "0042"
Beispiel für HTML-Escaping:
def html_escape(value):
"""Escape HTML special characters"""
if not isinstance(value, str):
value = str(value)
return value.replace("&", "&").replace("<", "<").replace(">", ">")
def safe_html(template):
"""Convert template to HTML-safe string"""
result = []
for part in template:
if isinstance(part, str):
result.append(part)
else:
result.append(html_escape(part.value))
return "".join(result)
user_input = "<script>alert('xss')</script>"
t = t"User said: {user_input}"
print(safe_html(t))
# Output: "User said: <script>alert('xss')</script>"
Siehe auch¶
PEP 750 - Spezifikation der Template-Strings
Format string syntax - Syntax von Format-Strings
Formatted string literals - f-Strings in Python