PEP 701: F-Strings Mais Flexíveis no Python 3.12

Como a PEP 701 do Python 3.12 reformula o parser das f-strings, permitindo reaproveitar as mesmas aspas, usar barras invertidas e escrever expressões multilinha com comentários dentro das chaves.

Desde que foram introduzidas no Python 3.6, as f-strings tinham uma limitação incômoda: a expressão dentro das chaves {} não podia usar o mesmo tipo de aspas da string externa, nem conter barras invertidas, nem quebrar em várias linhas com comentários. O Python 3.12 mudou isso com a PEP 701, que reformula o parser das f-strings e remove praticamente todas essas restrições, tratando o que está dentro das chaves como uma expressão Python de verdade — porque agora é exatamente isso que o interpretador faz.

O problema antes do Python 3.12

Antes da PEP 701, tentar reaproveitar o mesmo tipo de aspas dentro da expressão de uma f-string resultava em erro de sintaxe:

dados = {"nome": "Ana"}

# Antes do Python 3.12:
print(f"Ola, {dados["nome"]}")
# SyntaxError: f-string: expecting '}'

A saída era usar aspas diferentes por fora e por dentro, ou quebrar a expressão em uma variável separada:

dados = {"nome": "Ana"}

print(f'Ola, {dados["nome"]}')     # aspas diferentes
nome = dados["nome"]
print(f"Ola, {nome}")               # ou uma variável à parte

Reaproveitando as mesmas aspas

Com o Python 3.12, a expressão dentro das chaves é tokenizada de forma independente da string ao redor, então o mesmo caractere de aspas pode ser usado nos dois lugares sem conflito:

dados = {"nome": "Ana", "cidade": "Recife"}

print(f"Ola, {dados["nome"]} de {dados["cidade"]}")
# Ola, Ana de Recife

Isso é especialmente útil ao indexar dicionários ou listas dentro de f-strings, um dos casos mais comuns em que a restrição antiga incomodava.

Barras invertidas na expressão

Antes, uma barra invertida dentro de {} também não era permitida — o que impedia, por exemplo, chamar join() com "\n" diretamente na expressão. Agora funciona:

linhas = ["primeira", "segunda", "terceira"]

print(f"Lista:\n{"\n".join(linhas)}")
# Lista:
# primeira
# segunda
# terceira

Quebra de linha e comentários dentro da expressão

Expressões dentro de f-strings de múltiplas linhas (com """) agora podem se estender por várias linhas e até conter comentários com #, algo que gerava erro de sintaxe nas versões anteriores:

pedido = {"item": "teclado", "preco": 350.0, "quantidade": 2}

resumo = f"""
Pedido: {
    pedido["item"].upper()  # nome do produto em maiuscula
} - Total: R$ {
    pedido["preco"] * pedido["quantidade"]:.2f
}
"""
print(resumo)

Isso torna expressões mais longas ou com formatação condicional bem mais legíveis do que espremer tudo em uma única linha.

Erros de sintaxe mais precisos

Como consequência direta de tratar f-strings com um tokenizador próprio, as mensagens de erro passaram a apontar exatamente para o local do problema dentro da expressão, em vez de apontar para o início da f-string inteira:

valor = 10
f"Resultado: {valor +}"
# Python 3.12+: aponta a seta exatamente no "+" dentro da f-string,
# em vez de indicar apenas a linha da f-string como um todo

Quando isso faz diferença

Cuidados

Essas melhorias exigem Python 3.12 ou superior — código que depende dessa sintaxe não roda em versões anteriores do interpretador. A PEP 701 preserva a árvore sintática (AST) das f-strings existentes, então nenhum código antigo quebra: o que muda é apenas o que passa a ser aceito. Vale lembrar também que ferramentas de análise estática, formatadores e linters mais antigos podem não reconhecer a nova sintaxe corretamente; é importante manter black, ruff e afins atualizados antes de adotar esses recursos em projetos que usam essas ferramentas no pipeline de CI.

Compatibilidade

A PEP 701 foi implementada no Python 3.12, lançado em outubro de 2023, e está disponível em qualquer interpretador CPython a partir dessa versão, sem depender de nenhuma biblioteca externa.

documentação oficial

Conclusão

A PEP 701 não adiciona uma funcionalidade nova às f-strings, mas remove atritos que existiam desde a primeira versão: aspas repetidas, barras invertidas e expressões multilinha agora simplesmente funcionam, porque o parser passou a enxergar o conteúdo das chaves como o código Python que sempre foi. Para quem já usa f-strings no dia a dia, o ganho aparece nos pequenos detalhes — menos variáveis intermediárias e menos malabarismo com aspas.

Tecnologia:
python

Deixe seu Comentário!

Dúvida, sugestão ou só um "valeu!" — tudo é bem-vindo por aqui.

Comentário
Nome
Email
lock Seu e-mail não será publicado.