Почему f '{{{74}}}' совпадает с f '{{74}}' с f-строками?

109

f-строки доступны из 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
@ Кевин великий. Забавно, как f'{2+2}'возвращает 4, f'{{2+2}}'возвращает 2 + 2, f'{{{2+2}}}'➝ {4}, f'{{{{2+2}}}}'➝ {{2 + 2}} и так далее. Это имеет смысл, но с первого взгляда немного озадачивает.
Федорки "ТАК прекратить вредить"
2
Проще говоря, это потому f'{74}', что так же, как f'74'.
kaya3
1
Это не что-то новое с f-струнами, старое доброе str.formatтоже делает это.
Пейлонрайз
@Peilonrayz Как? "{74}".format(...)потребуется последовательность, по крайней мере, с 74 элементами.
gerrit

Ответы:

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}'
Конрад Рудольф
источник