Mas hoje, mas no programa de hoje o gotas de Pythão será sobre f-strings conhecido também como Literal String Interpolation. Esse recurso foi introduzido na versão 3.6 do Python e o objetivo é tornar a interpolação de Strings mais legível. Interpolação é só um nome chique para o ato de montar/construir uma String a partir de dados que você queira: uma variável, um retorno de método etc.
Antes, os jeitos mais comuns de interpolar Strings eram assim:
Format Strings (exemplo retirado da documentação oficial)
>>> 'Coordinates: {latitude}, {longitude}'.format(latitude='37.24N', longitude='-115.81W')
'Coordinates: 37.24N, -115.81W'
%-formatting (exemplo retirado da documentação oficial)
>>> print('%(language)s has %(number)03d quote types.' %
... {'language': "Python", "number": 2})
Python has 002 quote types.
Ainda contando com uma terceira opção (até então desconhecida por mim 😅):
Template Strings (exemplo retirado da documentação oficial)
>>> from string import Template
>>> s = Template('$who likes $what')
>>> s.substitute(who='tim', what='kung pao')
'tim likes kung pao'
Lendo os três trechos de código, é possível entender rápido o que cada um faz, sendo o Format Strings mais legível e o Template Strings menos legível. Mas quando se trata de escrever logs ou emails ou qualquer coisa com uma String maior, a legibilidade vai pro brejo. Partindo da ideia de que simples é melhor do que complexo, nasceu as f-strings.
Para usá-las, basta adicionar um f na frente de uma string - funcionam com aspas duplas ou simples.
>>> nome_completo = 'Maria Joaquina de Amaral Pereira Goes'
>>> print(f'Bem vinda, {nome_completo}')
Bem vinda, Maria Joaquina de Amaral Pereira Goes
As strings são manipuladas em tempo de execução. Você pode fazer bastante coisas com elas, inclusive adicionar expressões ou chamadas a outras funções:
>>> print(f'Bem vinda, {nome_completo.split(" ")[0]}.')
Bem vinda, Maria.
>>> print(f'Data e horário local: {datetime.now(): %B %d, %Y %H:%M:%S}')
Data e horário local: February 16, 2018 17:53:32
Inclusive lambdas:
>>> f'{(lambda x: x*2)(3)}'
'6'
Na documentação tem vários exemplos legais, inclusive do próprio código fonte do Python. 👌🏽
Vale lembrar que, apesar de ter entrado recentemente, esse recurso não exclui ou depreca os outros.
E você, já tinha começado a usar essa belezura? Alguma dica legal pra compartilhar? Até a próxima!
Bônus! ✨
O Elinaldo Monteiro sugeriu o post The new f-strings in Python 3.6. O autor fez um benchmark simples e bem legal com todas as possíveis formas de interpolar Strings e seu tempo de execução. O código está aqui e o resultado abaixo:
f-strings 2.996347602980677
format % 4.152905852010008
concat-strings 5.647188798990101
.format() 5.912839388009161
Template Strings 39.48270317300921
Impressionante! Mas não podemos esquecer que o Template Strings
tem algumas validações que impedem que alguém injete código malicioso, caso você esteja utilizando dados de entrada do usuário diretamente na String.
Translations
comments powered by Disqus