No dia 2 de outubro, foi liberada a versão 3.12 do Python. Ela contém várias novidades e otimizações.
Entre algumas das melhores novidades estão mensagens de erro muito mais aprimoradas, com a inclusão de mais exceções potencialmente causadas por erros de digitação. As novas mensagens agora fazem sugestões bem compreensíveis ao usuário, o que facilita muita a implementação de códigos.
Também foram feitas melhorias nas f-strings (abreviação de formatted string literals) que ficaram muito mais flexíveis e capazes de realizar várias coisas que não eram possíveis antes. Essas novidades em f-strings serão o tema deste post.
f-strings
No Python, f-strings são usadas para formatação e interpolação de strings. Elas foram introduzidas no Python 3.6 e rapidamente se popularizaram em função de suas sintaxes simples e legíveis. Anteriormente, interpolações de variáveis em strings eram feitas com o método .format().
linguagem = "Python"
minha_string = "Minha linguagem de programação preferida é o {}.".format(linguagem)
Com a introdução de f-strings, basta adicionar uma letra f (maiúscula ou minúscula) antes da string para realizar uma interpolação.
linguagem = "Python"
minha_string = f"Minha linguagem de programação preferida é o {linguagem}."
Novidades em f-strings
Mas a introdução de f-strings tinha várias limitações que a versão atual do Python superou. Vamos ver as principais.
Reutilização de aspas
Até o Python 3.11, não era permitido reutilizar as mesmas aspas numa f-string (por exemplo, aspas duplas usadas em sequência como mostrado abaixo).
>>> songs = ['Take me back to Eden', 'Alkaline', 'Ascensionism']
>>> f"Essa é a minha playlist: {", ".join(songs)}"
File "", line 1
f"Essa é a minha playlist: {", ".join(songs)}"
^
SyntaxError: f-string: expecting '}'
Isso forçava os usuários a terem que utilizar aspas diferentes (combinações de aspas simples e duplas, por exemplo). Veja um exemplo desse tipo de solução:
>>> songs = ['Take me back to Eden', 'Alkaline', 'Ascensionism']
>>> f"Essa é a minha playlist: {', '.join(songs)}"
'Essa é a minha playlist: Take me back to Eden, Alkaline, Ascensionism'
A nova versão corrige essa limitação.
>>> songs = ["Take me back to Eden", "Alkaline", "Ascensionism"]
>>> f"Essa é a minha playlist: {", ".join(songs)}"
'Essa é a minha playlist: Take me back to Eden, Alkaline, Ascensionism'
Com essa correção, aninhar várias strings, o que, na prática, acabava sendo impossível no Python 3.11, deixou de ser um problema.
>>> f"{f"{f"{f"{f"{f"{1+1+2}"}"}"}"}"}"
'4'
Expressões e comentários multilinhas
No Python 3.11, as expressões f-string devem ser definidas em uma única linha. O Python 3.12 não possui essa limitação.
>>> f"Essa é minha frase: {", ".join([
... 'Eu',
... 'sou',
... 'uma' ,
... 'string'
... ])}"
'Essa é minha frase: Eu, sou, uma, string'
Além disso, o Python 3.11 não permite usar barra invertida, o que é necessário para indicar uma nova linha. Frequentemente, essas proibições tornam as strings mais difíceis de serem lidas e mais limitadas. No Python 3.12, isso mudou.
>>> palavras = ["Eu", "sou", "uma", "string"]
>>> print(f"Essa é minha frase: {"\n".join(palavras)}")
Essa é minha frase: Eu
sou
uma
string
A permissão para usar barra invertida em f-strings também possibilita agora o uso de carácteres unicode.
>>> palavras = ["Eu", "sou", "uma", "string"]
>>> print(f"Essa é minha frase: {"\N{BLACK HEART SUIT}".join(palavras)}")
Essa é minha frase: Eu♥sou♥uma♥string
Comentários em expressões multilinhas
Outra novidade é a possibilidade de inserir comentários em f-strings multilinhas.
>>> f"Essa é minha frase: {", ".join([
... 'Eu', # essa é a palavra 1
... 'sou', # essa é a palavra 2
... 'uma' , # essa é a palavra 3
... 'string' # essa é a palavra 4
... ])}"
'Essa é minha frase: Eu, sou, uma, string'
Mensagens de erros mais compreensíveis
A última novidade que vamos mencionar se refere às mensagens de erro. Elas melhoraram muito na nova versão do Python e agora contam com sugestões mais compreensíveis que facilitam bastante as correções. Veja o exemplo abaixo com um erro numa f-string:
>>> my_string = f"{x z y}" + f"{1 + 1}"
File "", line 1
my_string = f"{x z y}" + f"{1 + 1}"
^^^
SyntaxError: invalid syntax. Perhaps you forgot a comma?
Para quem quer conhecer a lista completa de todas as novidades, visite o site oficial.