为什么带有f字符串的f'{{{74}}}'与f'{{74}}'相同?


109

f字符串可从Python 3.6中获得,对于格式化字符串非常有用:

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

Python 3的f字符串中阅读有关它们的更多信息:改进的字符串格式语法(指南)。我发现了一个有趣的模式:

请注意,使用三重花括号将导致字符串中只有一个大括号:

>>> 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}},依此类推。这很有道理,但乍一看有点困惑。
fedorqui'SO停止伤害

2
简而言之,这是因为f'{74}'与相同f'74'
kaya3

1
f弦乐不是什么新东西,好旧的str.format也是如此。
Peilonrayz

@Peilonrayz怎么样? "{74}".format(...)将需要一个至少包含74个元素的序列。
Gerrit

Answers:


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}'
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.