为什么在 f-strings 的大括号内不能使用反斜线?我该如何解决这个问题?
为什么在 f-strings 的大括号内不能使用反斜线?我该如何解决这个问题?
这个问题已经有了答案::
在Python >=3.6中,f-strings可以用作str.format
方法的替代品。作为一个简单的例子,它们是等价的:
'{} {}'.format(2+2, "hey") f'{2+2} {"hey"}'
忽略格式说明符,我可以在f字符串中将str.format
的位置参数放在大括号内。特别注意的是,我可以在这里放置str
字面量,尽管这可能有点不便。
然而,有一些限制。具体来说,任何形式的反斜杠都不能出现在f字符串的大括号内:
'{}'.format("new\nline") # legal f'{"new\nline"}' # illegal f'{"\\"}' # illegal
甚至我不能使用\\
来拆分一个长行,如果它在大括号内;
f'{2+\ 2}' # illegal
即使这种用法在普通的str
中也是完全允许的;
'{\ }'.format(2+2) # legal
对我来说,如果解析器在f字符串的大括号内看到\\
字符,就会编写一个硬停止。为什么要实现这种限制?尽管文档指定了这种行为,但并没有说明原因。
admin 更改状态以发布 2023年5月23日
你似乎期望
'{}'.format("new\nline")
和
f'{"new\nline"}'
是等价的。这并不是我所期望的,也不是在 Python 3.6 的预发行版本中反斜杠在 f-string 中的工作方式。在大括号之间使用反斜杠是允许的。那时候,你会因为
"new line"
不是有效的 Python 表达式而出错。
正如刚才所演示的那样,大括号中的反斜杠是令人困惑和模棱两可的,而它们被禁止以避免混淆:
这样做的目的是禁止像这样的复杂代码:
>>> d = {'a': 4} >>> f'{d[\'a\']}' '4'
此外,我还将禁止使用反斜杠来表示括号,如:
>>> f'\x7bd["a"]}' '4'
(其中 chr(0x7b) == "{"})。