【问题标题】:Why are double curly braces used instead of backslash in python f-strings?为什么在 python f-strings 中使用双花括号而不是反斜杠?
【发布时间】:2020-08-12 23:10:54
【问题描述】:

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

例如,转义双引号。

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

在 f 字符串中,大括号用于占位符。为了表示花括号,大括号是双倍的。

例如,

>>> f"{{}}" == "{}"
True

为什么在开发 f 弦时这种直观的方法不受欢迎?有什么技术或设计原因吗?

>>> f'\{\}'
  File "<stdin>", line 1
SyntaxError: f-string expression part cannot include a backslash

【问题讨论】:

标签: python string-formatting python-internals


【解决方案1】:

我相信 PEP 536 (Final Grammar for Literal String Interpolation) 说明了这一点: https://www.python.org/dev/peps/pep-0536/

来自 PEP 的动机部分的简短 sn-p 是“CPython 中 f 字符串的当前实现依赖于现有的字符串解析机制及其标记的后处理。这导致对可能的表达式有一些限制可在 f 字符串中使用:"

有关更多信息,请参阅此linked email

【讨论】:

  • 哇,这真的很棒。感谢您向我指出这些资源!
  • PEP 536 未被接受且未实现。其中建议的更改尚未进行。
  • @EdekiOkoh:不过,这是关于被拒绝的反斜杠的完全不同用法。我不知道有关使用\{ 转义大括号的讨论。
【解决方案2】:

jsmart 的答案听起来不错,但 existing f-string implementation 可以 相当容易地编写为使用 \{\} 而不是 {{}}。 PEP 536 解决的限制是不同的,例如如果使用' 来分隔 f 字符串本身,则无法在 f 字符串的表达式部分中使用 '

f-strings 更有可能使用{{}} 不是因为\{\} 很难实现,而是因为str.format 已经在使用{{}} 来实现表示引入 f 字符串时的文字大括号,并且 f 字符串语法基于 str.format 的语法。使用 {{}} 可以更轻松地在 str.format 和 f-strings 之间进行转换。没有令人信服的理由来更改现有的符号。

【讨论】:

    猜你喜欢
    • 2019-01-28
    • 2013-03-11
    • 1970-01-01
    • 1970-01-01
    • 2021-11-16
    • 2020-11-12
    • 2019-01-17
    • 1970-01-01
    • 2014-04-12
    相关资源
    最近更新 更多