string.templatelib — suport pentru șiruri șablon¶
Acest modul oferă suport pentru șiruri șablon (t-strings) așa cum sunt definite în PEP 750. Șirurile șablon sunt create folosind prefixul t și oferă acces atât la părțile literale ale șirului, cât și la valorile interpolate înainte ca acestea să fie combinate.
Disponibilitate: Șirurile șablon nu sunt acceptate pe camerele OpenMV Cam bazate pe STM32. Ele sunt disponibile numai pe camerele OpenMV Cam bazate pe Alif și i.MX RT.
Clase¶
- class string.templatelib.Template(*args)¶
Reprezintă un șir șablon. Obiectele Template sunt de obicei create prin sintaxa t-string (
t"..."), dar pot fi construite și direct folosind constructorul.- strings¶
Un tuplu de literali de șir care apar între interpolări.
- interpolations¶
Un tuplu de obiecte
Interpolationcare reprezintă expresiile interpolate.
- values¶
O proprietate doar pentru citire care returnează un tuplu conținând atributul
valuedin fiecare interpolare din șablon.
- __iter__() Iterator¶
Iterează peste conținutul șablonului, producând părțile de șir și obiectele
Interpolationîn ordinea în care apar. Șirurile goale sunt omise.
- __add__(other: Template) Template¶
Concatenează două șabloane. Returnează un nou
Templatecare combină șirurile și interpolările din ambele șabloane.Concatenarea șabloanelor cu
streste interzisă pentru a evita ambiguitatea privind faptul dacă șirul ar trebui tratat ca un literal sau ca o interpolare: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 = '')¶
Reprezintă o expresie interpolată din interiorul unui șir șablon. Toate argumentele pot fi transmise ca argumente cu cuvânt-cheie.
- value¶
Valoarea evaluată a expresiei interpolate.
- expression¶
Reprezentarea ca șir a expresiei, așa cum a apărut în șirul șablon.
- conversion¶
Specificatorul de conversie (
's'sau'r') dacă este prezent, altfelNone. Reține că MicroPython nu acceptă conversia'a'.
- format_spec¶
Șirul de specificare a formatului dacă este prezent, altfel un șir gol.
Sintaxa șirurilor șablon¶
Șirurile șablon folosesc aceeași sintaxă ca f-string-urile, dar cu un prefix t
name = "World"
template = t"Hello {name}!"
# Access template components
print(template.strings) # ('Hello ', '!')
print(template.values) # ('World',)
print(template.interpolations[0].expression) # 'name'
Specificatori de conversie¶
Șirurile șablon stochează specificatorii de conversie ca metadate. Spre deosebire de f-string-uri, conversia nu este aplicată automat:
value = "test"
t = t"{value!r}"
# t.interpolations[0].value == "test" (not repr(value))
# t.interpolations[0].conversion == "r"
Codul de procesare trebuie să aplice explicit conversiile atunci când este necesar.
Specificații de format¶
Specificațiile de format sunt stocate ca metadate în obiectul Interpolation. Spre deosebire de f-string-uri, formatarea nu este aplicată automat:
pi = 3.14159
t = t"{pi:.2f}"
# t.interpolations[0].value == 3.14159 (not formatted)
# t.interpolations[0].format_spec == ".2f"
Conform PEP 750, codul de procesare nu este obligat să folosească specificațiile de format, dar atunci când acestea sunt prezente ar trebui respectate și ar trebui să corespundă comportamentului f-string-urilor acolo unde este posibil.
Format de depanare¶
Formatul de depanare {expr=} este acceptat:
x = 42
t = t"{x=}"
# t.strings == ("x=", "")
# t.interpolations[0].expression == "x"
# t.interpolations[0].conversion == "r"
Important
Conform PEP 750, spre deosebire de f-string-uri, șirurile șablon nu aplică automat conversiile sau specificațiile de format. Acest lucru este intenționat, pentru a permite codului de procesare să controleze modul în care acestea sunt tratate. Codul de procesare trebuie să trateze explicit aceste atribute.
MicroPython nu oferă funcția încorporată format(). Folosește în schimb metode de formatare a șirurilor, precum str.format().
Exemplu de utilizare¶
Procesare de bază fără suport pentru format:
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)
Procesarea unui șablon cu suport pentru format:
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"
Exemplu de escaping HTML:
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>"
Vezi și¶
PEP 750 - specificația șirurilor șablon
Format string syntax - sintaxa șirurilor de format
Literali de șir formatați - f-string-uri în Python