为什么使用f-Strings时,f'{{{74}}}'与f'{{74}}'相同?

111

f-Strings 是从 Python 3.6 开始提供的,非常适用于字符串格式化。

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

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

Note that using triple braces will result in there being only single braces in your string:

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

However, you can get more braces to show if you use more than triple braces:

>>> 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}' - Kevin
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-strings的新功能,好老的str.format也可以实现这个。 - Peilonrayz
@gerrit 你试过用Konrad的str.format例子吗?它显然是一样的x = 74;'{{x}}'.format(x=x);'{{{x}}}'.format(x=x) -> '{x}', '{74}' - Peilonrayz
显示剩余7条评论
1个回答

122

双大括号用于转义大括号,以防止插值发生:{{{}}}。而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}'

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接