string.templatelib — Suporte a Strings de Modelo

Este módulo fornece suporte para strings de modelo (t-strings) conforme definido em PEP 750. As strings de modelo são criadas usando o prefixo t e fornecem acesso tanto às partes literais da string como aos valores interpolados antes de serem combinados.

Disponibilidade: As strings de modelo não são suportadas nas OpenMV Cams baseadas em STM32. Estão disponíveis apenas nas OpenMV Cams baseadas em Alif e i.MX RT.

Classes

class string.templatelib.Template(*args)

Representa uma string de modelo. Os objetos Template são normalmente criados pela sintaxe t-string (t"..."), mas também podem ser construídos diretamente usando o construtor.

strings

Um tuplo de literais de string que aparecem entre interpolações.

interpolations

Um tuplo de objetos Interpolation que representam as expressões interpoladas.

values

Uma propriedade somente de leitura que devolve um tuplo contendo o atributo value de cada interpolação no modelo.

__iter__() Iterator

Itera sobre o conteúdo do modelo, produzindo partes de string e objetos Interpolation na ordem em que aparecem. As strings vazias são omitidas.

__add__(other: Template) Template

Concatena dois modelos. Devolve um novo Template que combina as strings e interpolações de ambos os modelos.

Levanta:

TypeError – se other não for um Template

A concatenação de Template com str é proibida para evitar ambiguidade sobre se a string deve ser tratada como um literal ou interpolação:

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 = '')

Representa uma expressão interpolada dentro de uma string de modelo. Todos os argumentos podem ser passados como argumentos de palavra-chave.

value

O valor avaliado da expressão interpolada.

expression

A representação em string da expressão tal como apareceu na string de modelo.

conversion

O especificador de conversão ('s' ou 'r') se presente, caso contrário None. Note que o MicroPython não suporta a conversão 'a'.

format_spec

A string de especificação de formato se presente, caso contrário uma string vazia.

Sintaxe de Strings de Modelo

As strings de modelo usam a mesma sintaxe que as f-strings mas com um prefixo t

name = "World"
template = t"Hello {name}!"

# Access template components
print(template.strings)        # ('Hello ', '!')
print(template.values)         # ('World',)
print(template.interpolations[0].expression)  # 'name'

Especificadores de Conversão

As strings de modelo armazenam especificadores de conversão como metadados. Ao contrário das f-strings, a conversão não é aplicada automaticamente:

value = "test"
t = t"{value!r}"
# t.interpolations[0].value == "test" (not repr(value))
# t.interpolations[0].conversion == "r"

O código de processamento deve aplicar explicitamente as conversões quando necessário.

Especificações de Formato

As especificações de formato são armazenadas como metadados no objeto Interpolation. Ao contrário das f-strings, a formatação não é aplicada automaticamente:

pi = 3.14159
t = t"{pi:.2f}"
# t.interpolations[0].value == 3.14159 (not formatted)
# t.interpolations[0].format_spec == ".2f"

De acordo com a PEP 750, o código de processamento não é obrigado a utilizar especificações de formato, mas quando presentes devem ser respeitadas e corresponder ao comportamento das f-strings sempre que possível.

Formato de Depuração

O formato de depuração {expr=} é suportado:

x = 42
t = t"{x=}"
# t.strings == ("x=", "")
# t.interpolations[0].expression == "x"
# t.interpolations[0].conversion == "r"

Importante

De acordo com a PEP 750, ao contrário das f-strings, as strings de modelo não aplicam automaticamente conversões nem especificações de formato. Isto é intencional para permitir que o código de processamento controle como estes são tratados. O código de processamento deve tratar explicitamente estes atributos.

O MicroPython não fornece a função embutida format(). Use métodos de formatação de string como str.format().

Exemplo de Utilização

Processamento básico sem suporte a formato:

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)

Processamento de modelo com suporte a formato:

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"

Exemplo de escape 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;"

Consulte Também