string.templatelib — Ondersteuning voor template-strings¶
Deze module biedt ondersteuning voor template-strings (t-strings) zoals gedefinieerd in PEP 750. Template-strings worden gemaakt met het voorvoegsel t en bieden toegang tot zowel de letterlijke stringdelen als de geïnterpoleerde waarden voordat deze worden gecombineerd.
Beschikbaarheid: Template-strings worden niet ondersteund op de op STM32 gebaseerde OpenMV Cams. Ze zijn alleen beschikbaar op de op Alif en i.MX RT gebaseerde OpenMV Cams.
Classes¶
- class string.templatelib.Template(*args)¶
Vertegenwoordigt een template-string. Template-objecten worden doorgaans gemaakt met de t-string-syntaxis (
t"...") maar kunnen ook rechtstreeks worden geconstrueerd met de constructor.- strings¶
Een tuple van stringliteralen die tussen interpolaties voorkomen.
- interpolations¶
Een tuple van
Interpolation-objecten die de geïnterpoleerde expressies vertegenwoordigen.
- values¶
Een alleen-lezen property die een tuple teruggeeft met het
value-attribuut van elke interpolatie in de template.
- __iter__() Iterator¶
Itereert over de inhoud van de template en levert stringdelen en
Interpolation-objecten op in de volgorde waarin ze voorkomen. Lege strings worden weggelaten.
- __add__(other: Template) Template¶
Voegt twee templates samen. Geeft een nieuwe
Templateterug die de strings en interpolaties van beide templates combineert.Het samenvoegen van een template met een
stris verboden om ambiguïteit te voorkomen over de vraag of de string als literal of als interpolatie moet worden behandeld: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 = '')¶
Vertegenwoordigt een geïnterpoleerde expressie binnen een template-string. Alle argumenten kunnen als keyword-argumenten worden doorgegeven.
- value¶
De geëvalueerde waarde van de geïnterpoleerde expressie.
- expression¶
De stringweergave van de expressie zoals deze in de template-string verscheen.
- conversion¶
De conversiespecificatie (
's'of'r') indien aanwezig, andersNone. Merk op dat MicroPython de'a'-conversie niet ondersteunt.
- format_spec¶
De format-specificatiestring indien aanwezig, anders een lege string.
Syntaxis van template-strings¶
Template-strings gebruiken dezelfde syntaxis als f-strings, maar met een t-voorvoegsel:
name = "World"
template = t"Hello {name}!"
# Access template components
print(template.strings) # ('Hello ', '!')
print(template.values) # ('World',)
print(template.interpolations[0].expression) # 'name'
Conversiespecificaties¶
Template-strings slaan conversiespecificaties op als metadata. In tegenstelling tot f-strings wordt de conversie niet automatisch toegepast:
value = "test"
t = t"{value!r}"
# t.interpolations[0].value == "test" (not repr(value))
# t.interpolations[0].conversion == "r"
Verwerkingscode moet conversies expliciet toepassen wanneer dat nodig is.
Format-specificaties¶
Format-specificaties worden opgeslagen als metadata in het Interpolation-object. In tegenstelling tot f-strings wordt de opmaak niet automatisch toegepast:
pi = 3.14159
t = t"{pi:.2f}"
# t.interpolations[0].value == 3.14159 (not formatted)
# t.interpolations[0].format_spec == ".2f"
Volgens PEP 750 is verwerkingscode niet verplicht om format-specificaties te gebruiken, maar wanneer ze aanwezig zijn moeten ze worden gerespecteerd en waar mogelijk overeenkomen met het gedrag van f-strings.
Debug-formaat¶
Het debug-formaat {expr=} wordt ondersteund:
x = 42
t = t"{x=}"
# t.strings == ("x=", "")
# t.interpolations[0].expression == "x"
# t.interpolations[0].conversion == "r"
Belangrijk
Volgens PEP 750 passen template-strings, in tegenstelling tot f-strings, niet automatisch conversies of format-specificaties toe. Dit is opzettelijk zo ontworpen zodat verwerkingscode kan bepalen hoe deze worden afgehandeld. Verwerkingscode moet deze attributen expliciet afhandelen.
MicroPython biedt de ingebouwde functie format() niet. Gebruik in plaats daarvan stringopmaakmethoden zoals str.format().
Voorbeeldgebruik¶
Basisverwerking zonder format-ondersteuning:
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)
Een template verwerken met format-ondersteuning:
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"
Voorbeeld van 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>"
Zie ook¶
PEP 750 - Specificatie van template-strings
Format string syntax - Syntaxis van format-strings
Formatted string literals - f-strings in Python