string.templatelib — підтримка рядків-шаблонів

Цей модуль забезпечує підтримку рядків-шаблонів (t-рядків), визначених у PEP 750. Рядки-шаблони створюються за допомогою префікса t і надають доступ як до літеральних частин рядка, так і до інтерпольованих значень до їх об’єднання.

Доступність: Рядки-шаблони не підтримуються на OpenMV Cam на базі STM32. Вони доступні лише на OpenMV Cam на базі Alif та i.MX RT.

Класи

class string.templatelib.Template(*args)

Представляє рядок-шаблон. Об’єкти Template зазвичай створюються за допомогою синтаксису t-рядків (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;"

Дивіться також