Por que f '{{{74}}}' é o mesmo que f '{{74}}' com f-Strings?

109

O f-Strings está disponível no Python 3.6 e é muito útil para formatar strings:

>>> n='you'
>>> f'hello {n}, how are you?'
'hello you, how are you?'

Leia mais sobre eles nas f-Strings do Python 3: uma sintaxe aprimorada de formatação de strings (Guia) . Encontrei um padrão interessante:

Observe que o uso de chaves triplas resultará na existência de apenas chaves simples na sua string:

>>> f"{{{74}}}"
'{74}'

No entanto, você pode obter mais chaves para mostrar se usar mais do que chaves triplas:

>>> f"{{{{74}}}}"
'{{74}}'

E este é exatamente o caso:

>>> f'{74}'
'74'

>>> f'{{74}}'
'{74}'

Agora, se passarmos de dois {para três, o resultado será o mesmo:

>>> f'{{{74}}}'
'{74}'           # same as f'{{74}}' !

Então, precisamos de até 4! ( {{{{) para obter duas chaves como saída:

>>> f'{{{{74}}}}'
'{{74}}'

Por que é isso? O que acontece com dois aparelhos para que o Python exija um extra a partir desse momento?

fedorqui 'Então pare de prejudicar'
fonte
70
Pode ser esclarecedor para comparar as saídas dos f"{{2+2}}"e f"{{{2+2}}}", que são '{2+2}'e '{4}'respectivamente
Kevin
3
@ Kevin grande. É engraçado como f'{2+2}'retorna 4, f'{{2+2}}'retorna 2 + 2, f'{{{2+2}}}'➝ {4}, f'{{{{2+2}}}}'➝ {{2 + 2}} e assim por diante. Faz sentido, mas se confunde um pouco à primeira vista.
fedorqui 'Então pare de prejudicar'
2
Simplificando, é porque f'{74}'é o mesmo que f'74'.
kaya3
11
Isso não é novidade em f-strings, o bom e velho str.formatfaz isso também.
Peilonrayz
@Peilonrayz How? "{74}".format(...)exigiria uma sequência com pelo menos 74 elementos.
Gerrit 19/12/19

Respostas:

118

Aparelhos duplos escapam dos aparelhos, para que não ocorra interpolação: {{{e }}}. E 74continua sendo uma string inalterada '74'.

Com chaves triplas, as chaves duplas externas são escapadas, o mesmo que acima. Os chavetas internas, por outro lado, levam à interpolação regular do string 74.

Ou seja, a cadeia f'{{{74}}}'é equivalente a f'{{ {74} }}', mas sem espaços (ou, equivalentemente, a '{' + f'{74}' + '}').

Você pode ver a diferença ao substituir a constante numérica por uma variável:

In [1]: x = 74

In [2]: f'{{x}}'
Out[2]: '{x}'

In [3]: f'{{{x}}}'
Out[3]: '{74}'
Konrad Rudolph
fonte