Warum ist f '{{{74}}}' dasselbe wie f '{{74}}' mit f-Strings?

109

f-Strings sind in Python 3.6 verfügbar und sehr nützlich zum Formatieren von Strings:

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

Weitere Informationen hierzu finden Sie in Python 3s f-Strings: Eine verbesserte Syntax zur Formatierung von Zeichenfolgen (Handbuch) . Ich habe ein interessantes Muster gefunden:

Beachten Sie, dass die Verwendung dreifacher Klammern dazu führt, dass Ihre Zeichenfolge nur einzelne Klammern enthält:

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

Sie können jedoch mehr Klammern anzeigen, wenn Sie mehr als dreifache Klammern verwenden:

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

Und genau das ist der Fall:

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

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

Wenn wir nun von zwei {auf drei gehen, ist das Ergebnis dasselbe:

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

Wir brauchen also bis zu 4! ( {{{{) um zwei geschweifte Klammern als Ausgabe zu erhalten:

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

Warum ist das? Was passiert mit zwei geschweiften Klammern, damit Python von diesem Moment an eine zusätzliche benötigt?

fedorqui 'SO hör auf zu schaden'
quelle
70
Es kann sein , die Beleuchtung der Ausgänge zu vergleichen f"{{2+2}}"und f"{{{2+2}}}", das sind '{2+2}'und '{4}'jeweils
Kevin
3
@ Kevin toll. Es ist lustig, wie f'{2+2}'4, f'{{2+2}}'2 + 2, f'{{{2+2}}}'returns {4}, f'{{{{2+2}}}}'➝ {{2 + 2}} usw. zurückgegeben werden. Es macht Sinn, rätselt aber auf den ersten Blick ein bisschen.
Fedorqui 'SO hör auf zu schaden'
2
Einfach gesagt, weil f'{74}'es dasselbe ist wie f'74'.
Kaya3
1
Das ist nichts Neues mit F-Strings, das gute alte str.formatmacht das auch.
Peilonrayz
@Peilonrayz Wie? "{74}".format(...)würde eine Sequenz mit mindestens 74 Elementen erfordern.
Gerrit

Antworten:

118

Doppelte Klammern entziehen sich den Klammern, so dass keine Interpolation stattfindet: {{{und }}}. Und 74bleibt eine unveränderte Zeichenfolge '74'.

Bei dreifachen Klammern werden die äußeren Doppelklammern wie oben ausgeblendet. Die inneren Klammern führen dagegen zu einer regelmäßigen String-Interpolation des Wertes 74.

Das heißt, die Zeichenfolge f'{{{74}}}'ist äquivalent zu f'{{ {74} }}', jedoch ohne Leerzeichen (oder äquivalent zu '{' + f'{74}' + '}').

Sie können den Unterschied sehen, wenn Sie die numerische Konstante durch eine Variable ersetzen:

In [1]: x = 74

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

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