Чому f '{{{74}}}' те саме, що f '{{74}}' з f-Strings?


109

f-Strings доступні в Python 3.6 і дуже корисні для форматування рядків:

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

Детальніше про них читайте у f-Strings Python 3: Удосконалений синтаксис форматування рядків (посібник) . Я знайшов цікавий зразок:

Зауважте, що використання потрійних дужок призведе до того, що у рядку будуть лише поодинокі дужки:

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

Однак ви можете отримати більше брекетів, щоб показати, якщо ви використовуєте більше, ніж потрійні брекети:

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

І саме так:

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

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

Тепер, якщо ми проходимо від двох {до трьох, результат такий же:

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

Тож нам потрібно до 4! ( {{{{), щоб отримати два дужки як вихід:

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

Чому це? Що відбувається з двома дужками, щоб Python з цього моменту вимагав додаткового?


70
Може бути ілюмінацією порівняння результатів f"{{2+2}}"та f"{{{2+2}}}", які є '{2+2}'і '{4}'відповідно
Кевіна

3
@Kevin чудовий. Смішно, як f'{2+2}'повертає 4, f'{{2+2}}'повертає 2 + 2, f'{{{2+2}}}'➝ {4}, f'{{{{2+2}}}}'➝ {{2 + 2}} тощо. Це має сенс, але головоломки трохи з першого погляду.
fedorqui 'ТАК перестаньте шкодити'

2
Простіше кажучи, це тому, що f'{74}'це те саме, що f'74'.
kaya3

1
Це не щось нове з f-рядками, хороший старий str.formatробить це теж.
Пейлонрайз

@Peilonrayz Як? "{74}".format(...)зажадала б послідовність із щонайменше 74 елементами.
Герріт

Відповіді:


118

Подвійні дужки ухиляються від дужок, щоб не трапилось інтерполяції: {{{і }}}. І 74залишається незмінним рядком,'74' .

При потрійних брекетах виходять зовнішні подвійні дужки, такі ж, як і вище. Внутрішні дужки, з іншого боку, призводять до регулярної рядкової інтерполяції значення74 .

Тобто рядок f'{{{74}}}'еквівалентний f'{{ {74} }}', але без пробілів (або, що еквівалентно, до'{' + f'{74}' + '}' ).

Ви можете побачити різницю, замінивши числову константу змінною:

In [1]: x = 74

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

In [3]: f'{{{x}}}'
Out[3]: '{74}'
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.