[python drops] f-strings


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