As novas `t-strings` do Python
(davepeck.org)- t-strings (strings de template) são um novo recurso de processamento de strings seguro e flexível introduzido no Python 3.14
- Diferentemente das f-strings existentes, uma t-string retorna um objeto
Template, não uma string, permitindo processamento seguro sem saída automática - As t-strings têm uma estrutura que permite escapar com segurança entradas dinâmicas em HTML, SQL e outros contextos
- É um conceito semelhante aos tagged templates do JavaScript, permitindo várias extensões de transformação e processamento
- Se o ecossistema de ferramentas de desenvolvimento Python oferecer bom suporte a esse recurso, ele poderá provocar uma grande mudança no processamento de strings voltado para web/segurança
Novo recurso do Python: t-strings (Template Strings)
- A partir do Python 3.14, as strings de template (t-strings), usadas com a sintaxe
t"...", passam a fazer parte oficial da linguagem - Diferentemente das f-strings existentes, uma t-string é avaliada como um objeto
string.templatelib.Template, e não imediatamente como string - Esse objeto exige uma etapa de processamento separada antes da saída, e por meio desse processo é possível fazer tratamento e transformação seguros de valores dinâmicos
Por que f-strings podem ser perigosas?
- Como as f-strings são avaliadas imediatamente como string, em códigos que incluem entrada do usuário podem ocorrer SQL Injection ou XSS
- Exemplo:
f"<div>{user_input}</div>"→ código malicioso pode ser inserido diretamente
- Exemplo:
- As t-strings adiam essa avaliação, fazendo com que só possam ser usadas após processamento explícito
Exemplo de uso de t-strings
-
Exemplo de escape de HTML:
evil = "<script>alert('bad')</script>" template = t"<p>{evil}</p>" safe = html(template) # safe é "<p><script>alert('bad')</script></p>" -
Também é possível fazer processamentos mais complexos, como inserção automática de atributos:
attributes = {"src": "roquefort.jpg", "alt": "Yum"} template = t"<img {attributes} />" element = html(template) # resultado: "<img src='roquefort.jpg' alt='Yum' />"
Estrutura e API
-
O objeto
Templatefornece separadamente o texto original e os valores interpolados por meio dos atributos.stringse.values -
Pelo atributo
interpolations, também é possível acessar detalhes de formatação como!s,:>8e outros -
Pela iteração, também é possível processar diretamente o estado misto de texto e valores
-
A criação manual também é possível:
from string.templatelib import Template, Interpolation template = Template( "Hello ", Interpolation(value="World", expression="name"), "!" )
Exemplo divertido: conversor para Pig Latin
-
Exemplo que percorre o conteúdo do objeto
Templatee transforma palavras em Pig Latin:def pig_latin(template: Template) -> str: ... name = "world" template = t"Hello {name}!" assert pig_latin(template) == "Hello orldway!"
Direção futura de evolução
- As t-strings podem trazer segurança e extensibilidade ao processamento de strings voltado para web/segurança
- Espera-se que ferramentas de desenvolvimento como
black,ruffe VS Code passem a oferecer suporte a formatação/destaque para t-strings - Como são semelhantes ao modelo de tagged templates com o qual desenvolvedores JavaScript já estão familiarizados, há grande potencial de uso em vários frameworks
Colaboração com a comunidade de desenvolvedores
- Esse recurso foi concluído com a participação e colaboração de vários membros da comunidade Python
- Em especial, são mencionadas interações com figuras-chave como Jim, Paul, Koudai, Lysandros e Guido
- O PEP 750 e seu repositório de exemplos podem ser consultados no GitHub
O recurso de t-strings do Python 3.14 garante ao mesmo tempo segurança e extensibilidade para strings, representando um salto importante além das limitações das f-strings
2 comentários
PEP 750 – Aprovação das template strings (
t-strings)Comentários do Hacker News
No geral, esse recurso é bem legal. Basicamente, ele transforma um código como este
em algo assim
Há a questão de saber se esse açúcar sintático traz benefícios suficientes para justificar a complexidade de um novo recurso da linguagem. Acho que, neste caso, sim, por dois motivos
{}, e isso provavelmente vai gerar bons casos de usoTambém espero que o ecossistema de ferramentas se adapte para dar suporte a t-strings. Por exemplo, seria bom se black e ruff formatassem o conteúdo de t-strings, e se o vscode destacasse com cores conteúdos de tipos comuns, como HTML ou SQL
sql”select * from {table}”poderia fazer isso, mas não há garantia de que o que está no template será convertido em SQL válido pela função de conversão.t“give me {table} but only {columns}”pode se transformar em SQL válido depois que o template for processadoSerá que poderíamos usar uma sintaxe SQL elegante como esta?
Se a função
db.get()aceitar templates, então sim. Seria a forma mais elegante de usar SQL que já vi até agoraPessoalmente, acho que esse recurso está focado demais em um problema específico para virar uma funcionalidade geral. Python está ficando cada vez maior. Quando as pessoas perguntam se Python é fácil e simples de aprender, temos que responder: "o básico sim, mas aprender a linguagem inteira não"
Grande discussão (414 pontos, há 10 dias, 324 comentários) link
Bem legal. Se estão portando recursos de JS, será que o próximo passo é ganhar unpacking/destructuring de dicionários?
Só o fato de esse novo recurso x-string ser embutido já parece uma "trapaça". Seria legal se fosse possível fazer algo como
Zen of Python em 2025:
Formatação de strings em Python em 2025:
%+str.format()Não entendo como isso é diferente de aplicar uma função ao template em vez de aplicá-la à variável dentro de uma f-string. Então, em vez de fazer algo como:
por que não simplesmente fazer isto:
Ou então antes de criar a f-string. Será que a ideia é simplesmente garantir que você não esqueça a parte de sanitização/manipulação de string e seja forçado a passar por ela?
Olá! Eu escrevi esse post :-)