为什么在f字符串中不能使用反斜杠?

时间:2018-08-09 21:21:44

标签: python python-3.x string-formatting backslash f-string

在Python> = 3.6中,f字符串可以替代str.format方法。举一个简单的例子,它们是等效的:

'{} {}'.format(2+2, "hey")
f'{2+2} {"hey"}'

不管format specifiers,我基本上可以将str.format的位置参数移动到f字符串的大括号内。请特别注意,尽管看起来有点笨拙,但我只允许在其中输入str文字。

但是有一些限制。具体来说,backslashes in any shape or form不允许放在f字符串的花括号内:

'{}'.format("new\nline")  # legal
f'{"new\nline"}'          # illegal
f'{"\\"}'                 # illegal

如果在括号内,我什至不能使用\来分隔长行;

f'{2+\
2}'     # illegal

即使在正常\的内部完全允许使用str,也是如此;

'{\
}'.format(2+2)  # legal

在我看来,如果解析器在f字符串的花括号内完全看到\字符,则将硬停止编码到解析器中。为什么要实施此限制?尽管docs指定了这种行为,但并不能说明原因。

3 个答案:

答案 0 :(得分:6)

您似乎期望

'{}'.format("new\nline")

f'{"new\nline"}'

等同。这不是我所期望的,也不是f字符串中的反斜杠在Python 3.6的预发行版本中如何起作用的,其中允许在括号之间使用反斜杠。那时,您会收到错误消息,因为

"new
line"

不是有效的Python表达式。

正如刚刚演示的那样,花括号中的反斜杠令人困惑和模棱两可,它们banned可以避免混淆:

  

这样做的目的是禁止像这样的复杂代码:

>>> d = {'a': 4}
>>> f'{d[\'a\']}'
'4'
     

此外,我不允许将转义用于括号,如:

>>> f'\x7bd["a"]}'
'4'
     

(其中chr(0x7b)==“ {”)。

答案 1 :(得分:3)

你不能这样做很烦人:

things = ['Thing one','Thing two','Thing three']
print(f"I have a list of things: \n{'\n'.join(things)}")

但你可以这样做:

things = ['Thing one','Thing two','Thing three']
nl = '\n'
print(f"I have a list of things:\n{nl.join(things)}")

答案 2 :(得分:3)

对于换行,您可以使用 os.linesep 代替 \n。例如:

>>> import os
>>> 
>>> print(f"Numbers:\n{os.linesep.join(map(str, [10, 20, 30]))}")
Numbers:
10
20
30