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, сочетающий строки и интерполяции из обоих шаблонов.

Исключение:

TypeError – если other не является 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("&", "&amp;").replace("<", "&lt;").replace(">", "&gt;")

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: &lt;script&gt;alert('xss')&lt;/script&gt;"

См. также