为什么在Python f-strings中使用双花括号而不是反斜杠?

6

我们通常使用反斜杠来转义非法字符。

例如,转义双引号。

>>> "\"" == '"'
True

在f-strings中,花括号用于占位符。要表示一个花括号,需要将花括号重复一遍。
例如:
>>> f"{{}}" == "{}"
True

为什么在开发f-strings时没有采用这种直观的方法?是否有技术或设计上的原因?
>>> f'\{\}'
  File "<stdin>", line 1
SyntaxError: f-string expression part cannot include a backslash

是的,这很奇怪。对于 f'{\{\}} 也是一样。 - GAEfan
2016年曾经有过一场关于这个问题的激烈讨论。阅读一下是值得的,但简而言之,他们想保持简单,因为有人争论类似f'{'\n'}'这样的东西会被视为字符串还是表达式。 - Edeki Okoh
这与str.format的现有转义规则相匹配。 - user2357112
它也可以使用格式化,例如'%d%%' % 42 => '42%' - superb rain
2个回答

3
我相信 PEP 536(字面字符串插值的最终语法)涉及到了这一点: https://www.python.org/dev/peps/pep-0536/ PEP 的动机部分摘录如下:“CPython 中 f-strings 的当前实现依赖于现有的字符串解析机制和其标记的后处理。这导致了在 f-strings 中可用的可能表达式受到了几个限制:”
有关更多信息,请参阅此链接的电子邮件

1
如果有人想要了解更多关于这个原因的推理,请访问以下链接:https://mail.python.org/pipermail/python-ideas/2016-August/041837.html - Edeki Okoh
哇,这真的很棒。感谢您指引我使用这些资源! - fizzybear
PEP 536尚未被接受和实现。其中提出的更改尚未完成。 - user2357112
@EdekiOkoh:不过那是关于完全不同的反斜杠用法被拒绝了。我不知道有关使用\{转义大括号的讨论。 - user2357112

3
jsmart的回答听起来不错,但是现有的f-string实现 可能 很容易地使用\{\}代替{{}}。 PEP 536将解决的限制是不同的,例如在表达式部分中使用',如果'用于定界f-string本身,则无法使用。

更有可能的是,f-strings使用{{}}而不是\{\},不是因为\{\}难以实现,而是因为当引入f-strings时,str.format已经使用{{}}表示文字括号,并且f-string语法基于str.format的语法。使用{{}}使得在str.format和f-strings之间进行转换更加容易。没有强制性的理由改变现有的符号。


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