string.templatelib — Suporte a Template Strings¶
Este módulo fornece suporte a template strings (t-strings) conforme definido na PEP 750. As template strings são criadas usando o prefixo t e fornecem acesso tanto às partes literais da string quanto aos valores interpolados antes de serem combinados.
Disponibilidade: As template strings não são suportadas nas OpenMV Cams baseadas em STM32. Elas estão disponíveis apenas nas OpenMV Cams baseadas em Alif e i.MX RT.
Classes¶
- class string.templatelib.Template(*args)¶
Representa uma template string. Objetos Template são tipicamente criados pela sintaxe de t-string (
t"..."), mas também podem ser construídos diretamente usando o construtor.- strings¶
Uma tupla de literais de string que aparecem entre as interpolações.
- interpolations¶
Uma tupla de objetos
Interpolationrepresentando as expressões interpoladas.
- values¶
Uma propriedade somente leitura que retorna uma tupla contendo o atributo
valuede cada interpolação no template.
- __iter__() Iterator¶
Itera sobre o conteúdo do template, produzindo partes de string e objetos
Interpolationna ordem em que aparecem. Strings vazias são omitidas.
- __add__(other: Template) Template¶
Concatena dois templates. Retorna um novo
Templatecombinando as strings e interpolações de ambos os templates.A concatenação de template com
stré proibida para evitar ambiguidade sobre se a string deve ser tratada como literal ou como 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 template string. Todos os argumentos podem ser passados como argumentos nomeados.
- value¶
O valor avaliado da expressão interpolada.
- expression¶
A representação em string da expressão como ela apareceu na template string.
- conversion¶
O especificador de conversão (
's'ou'r') se presente, caso contrárioNone. Observe 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 das Template Strings¶
As template strings usam a mesma sintaxe das 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 template strings armazenam os 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 as conversões explicitamente 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"
Conforme a PEP 750, o código de processamento não é obrigado a usar as especificações de formato, mas, quando presentes, elas 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
Conforme a PEP 750, ao contrário das f-strings, as template strings não aplicam automaticamente conversões ou especificações de formato. Isso é intencional, para permitir que o código de processamento controle como essas são tratadas. O código de processamento deve tratar esses atributos explicitamente.
O MicroPython não fornece a função embutida format(). Use métodos de formatação de string como str.format() em vez disso.
Exemplo de Uso¶
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 template 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 de 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>"
Veja Também¶
PEP 750 - Especificação das Template Strings
Format string syntax - Sintaxe de strings de formato
Literais de string formatados - f-strings no Python