string.templatelib — Поддержка шаблонных строк¶
Этот модуль предоставляет поддержку шаблонных строк (t-strings), как определено в PEP 750. Шаблонные строки создаются с помощью префикса t и предоставляют доступ как к литеральным частям строки, так и к интерполированным значениям до их объединения.
Доступность: Шаблонные строки не поддерживаются на OpenMV Cam на базе STM32. Они доступны только на OpenMV Cam на базе Alif и i.MX RT.
Классы¶
- class string.templatelib.Template(*args)¶
Представляет шаблонную строку. Объекты Template обычно создаются с помощью синтаксиса t-string (
t"..."), но также могут быть сконструированы напрямую с помощью конструктора.- strings¶
Кортеж строковых литералов, которые появляются между интерполяциями.
- interpolations¶
Кортеж объектов
Interpolation, представляющих интерполированные выражения.
- values¶
Свойство только для чтения, возвращающее кортеж, содержащий атрибут
valueиз каждой интерполяции в шаблоне.
- __iter__() Iterator¶
Итерирует содержимое шаблона, выдавая строковые части и объекты
Interpolationв порядке их появления. Пустые строки опускаются.
- __add__(other: Template) Template¶
Объединяет два шаблона. Возвращает новый
Template, сочетающий строки и интерполяции из обоих шаблонов.Объединение шаблона со
strзапрещено, чтобы избежать неоднозначности относительно того, следует ли трактовать строку как литерал или как интерполяцию: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 = '')¶
Представляет интерполированное выражение внутри шаблонной строки. Все аргументы могут передаваться как именованные аргументы.
- value¶
Вычисленное значение интерполированного выражения.
- expression¶
Строковое представление выражения в том виде, в каком оно появилось в шаблонной строке.
- conversion¶
Спецификатор преобразования (
's'или'r'), если он присутствует, иначеNone. Обратите внимание, что MicroPython не поддерживает преобразование'a'.
- format_spec¶
Строка спецификации формата, если она присутствует, иначе пустая строка.
Синтаксис шаблонных строк¶
Шаблонные строки используют тот же синтаксис, что и f-строки, но с префиксом t:
name = "World"
template = t"Hello {name}!"
# Access template components
print(template.strings) # ('Hello ', '!')
print(template.values) # ('World',)
print(template.interpolations[0].expression) # 'name'
Спецификаторы преобразования¶
Шаблонные строки хранят спецификаторы преобразования как метаданные. В отличие от f-строк, преобразование не применяется автоматически:
value = "test"
t = t"{value!r}"
# t.interpolations[0].value == "test" (not repr(value))
# t.interpolations[0].conversion == "r"
Обрабатывающий код должен явно применять преобразования при необходимости.
Спецификации формата¶
Спецификации формата хранятся как метаданные в объекте Interpolation. В отличие от f-строк, форматирование не применяется автоматически:
pi = 3.14159
t = t"{pi:.2f}"
# t.interpolations[0].value == 3.14159 (not formatted)
# t.interpolations[0].format_spec == ".2f"
Согласно PEP 750, обрабатывающий код не обязан использовать спецификации формата, но при их наличии их следует учитывать и по возможности соответствовать поведению f-строк.
Формат отладки¶
Формат отладки {expr=} поддерживается:
x = 42
t = t"{x=}"
# t.strings == ("x=", "")
# t.interpolations[0].expression == "x"
# t.interpolations[0].conversion == "r"
Важно
Согласно PEP 750, в отличие от f-строк, шаблонные строки не применяют автоматически преобразования или спецификации формата. Это сделано намеренно, чтобы позволить обрабатывающему коду управлять тем, как они обрабатываются. Обрабатывающий код должен явно обрабатывать эти атрибуты.
MicroPython не предоставляет встроенную функцию format(). Вместо этого используйте методы форматирования строк, такие как str.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)
Обработка шаблона с поддержкой формата:
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"
Пример экранирования 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>"
См. также¶
PEP 750 – спецификация шаблонных строк
Format string syntax – синтаксис строк формата
Форматированные строковые литералы – f-строки в Python