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
- Acessar chaves de dicionário ou índices de lista diretamente na f-string sem trocar o tipo de aspas.
- Formatar textos com
join(), quebras de linha ("\n") ou outras strings com escape direto na expressão. - Montar mensagens longas com múltiplas expressões, comentando cada trecho para facilitar manutenção.
- Gerar código ou templates que antes exigiam variáveis intermediárias só para contornar a limitação de aspas.
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.
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.
0 Comentário
Deixe seu Comentário!
Dúvida, sugestão ou só um "valeu!" — tudo é bem-vindo por aqui.