Dlaczego f '{{{{}}}} jest taki sam jak f' {{74}} 'z f-Strings?

109

Ciągi f są dostępne w Pythonie 3.6 i są bardzo przydatne do formatowania ciągów:

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

Przeczytaj więcej o nich w f-Strings Pythona 3: Ulepszona składnia formatowania łańcuchów (przewodnik) . Znalazłem interesujący wzór:

Zauważ, że użycie potrójnych nawiasów spowoduje, że w łańcuchu będą znajdować się tylko pojedyncze nawiasy:

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

Możesz jednak wyświetlić więcej nawiasów klamrowych, aby pokazać, jeśli używasz więcej niż potrójnych nawiasów klamrowych:

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

I dokładnie tak jest:

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

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

Teraz, jeśli przejdziemy od dwóch {do trzech, wynik będzie taki sam:

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

Potrzebujemy więc do 4! ( {{{{), aby uzyskać dwa nawiasy klamrowe jako wynik:

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

Dlaczego to? Co dzieje się z dwoma nawiasami klamrowymi, aby Python wymagał dodatkowego od tego momentu?

fedorqui „SO przestań szkodzić”
źródło
70
To może być pouczające porównać wyjścia f"{{2+2}}"i f"{{{2+2}}}", które są '{2+2}'i '{4}'odpowiednio
Kevin
3
@Kevin great one. To zabawne, jak f'{2+2}'zwraca 4, f'{{2+2}}'zwraca 2 + 2, f'{{{2+2}}}'➝ {4}, f'{{{{2+2}}}}'➝ {{2 + 2}} i tak dalej. Ma to sens, ale na pierwszy rzut oka trochę łamigłówki.
fedorqui „SO przestań krzywdzić”
2
Mówiąc wprost, to dlatego, że f'{74}'jest taki sam jak f'74'.
kaya3
1
To nie jest nic nowego z f-strunami, stary dobry str.formatteż to robi.
Peilonrayz,
@Peilonrayz Jak? "{74}".format(...)wymagałoby sekwencji z co najmniej 74 elementami.
gerrit

Odpowiedzi:

118

Podwójne nawiasy klamrowe uciekają od nawiasów klamrowych, aby nie doszło do interpolacji: {{{i }}}. I 74pozostaje niezmieniony łańcuch, '74'.

W przypadku potrójnych nawiasów zewnętrzne podwójne nawiasy klamrowe są unikane, tak jak powyżej. Natomiast wewnętrzne nawiasy klamrowe prowadzą do regularnej interpolacji ciągu znaków 74.

Oznacza to, że łańcuch f'{{{74}}}'jest równoważny f'{{ {74} }}', ale bez spacji (lub równoważnie, '{' + f'{74}' + '}').

Różnicę można zobaczyć, zastępując stałą numeryczną zmienną:

In [1]: x = 74

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

In [3]: f'{{{x}}}'
Out[3]: '{74}'
Konrad Rudolph
źródło