Perché f '{{{74}}}' è uguale a f '{{74}}' con f-Strings?


109

Le f-string sono disponibili da Python 3.6 e sono molto utili per la formattazione delle stringhe:

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

Maggiori informazioni su di essi nelle f-Strings di Python 3: sintassi di formattazione delle stringhe migliorata (Guida) . Ho trovato uno schema interessante:

Nota che l'uso di parentesi graffe multiple comporterà la presenza di sole parentesi graffe singole nella stringa:

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

Tuttavia, puoi ottenere più parentesi graffe da mostrare se usi più di triple parentesi:

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

E questo è esattamente il caso:

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

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

Ora se passiamo da due {a tre, il risultato è lo stesso:

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

Quindi abbiamo bisogno di un massimo di 4! ( {{{{) per ottenere due parentesi graffe come output:

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

Perchè è questo? Cosa succede con due parentesi graffe se Python ne richiede una in più da quel momento in poi?


70
Potrebbe essere illuminante confrontare le uscite di f"{{2+2}}"e f"{{{2+2}}}", che sono '{2+2}'e '{4}'rispettivamente
Kevin il

3
@ Kevin grande. È divertente come f'{2+2}'ritorni 4, f'{{2+2}}'ritorni 2 + 2, f'{{{2+2}}}'➝ {4}, f'{{{{2+2}}}}'➝ {{2 + 2}} e così via. Ha senso, ma si confonde un po 'a prima vista.
fedorqui "SO smettere di danneggiare" il

2
In parole povere, è perché f'{74}'è uguale a f'74'.
kaya3,

1
Questo non è nulla di nuovo con le stringhe a f, anche il buon vecchio lo str.formatfa.
Peilonrayz,

@Peilonrayz How? "{74}".format(...)richiederebbe una sequenza con almeno 74 elementi.
Gerrit,

Risposte:


118

Le doppie parentesi sfuggono alle parentesi graffe, in modo che non si verifichino interpolazioni: {{{e }}}. E 74rimane una stringa immutata, '74'.

Con le bretelle triple, le doppie bretelle esterne sono sfuggite, come sopra. Le parentesi graffe interne, d'altra parte, portano a una regolare interpolazione di stringhe del valore 74.

Cioè, la stringa f'{{{74}}}'è equivalente a f'{{ {74} }}', ma senza spazi (o, equivalentemente, a '{' + f'{74}' + '}').

Puoi vedere la differenza quando sostituisci la costante numerica con una variabile:

In [1]: x = 74

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

In [3]: f'{{{x}}}'
Out[3]: '{74}'
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.