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

jmd*_*_dk 3 python string-formatting backslash python-3.x f-string

在Python> = 3.6中,f-strings可以用作方法的替代品str.format.举个简单的例子,它们是等价的:

'{} {}'.format(2+2, "hey")
f'{2+2} {"hey"}'
Run Code Online (Sandbox Code Playgroud)

忽略格式说明符,我基本上可以str.format在f字符串中移动内部大括号的位置参数.请特别注意,我可以将str文字放在这里,虽然看起来有点笨拙.

但是有一些限制.具体来说,任何形状或形式的反斜杠都不允许在f字符串的大括号内:

'{}'.format("new\nline")  # legal
f'{"new\nline"}'          # illegal
f'{"\\"}'                 # illegal
Run Code Online (Sandbox Code Playgroud)

\如果它在支架内,我甚至不能用它来分开一条长线;

f'{2+\
2}'     # illegal
Run Code Online (Sandbox Code Playgroud)

即使\在正常情况下完全允许这种用法str;

'{\
}'.format(2+2)  # legal
Run Code Online (Sandbox Code Playgroud)

在我看来,如果它\在f字符串的大括号内完全看到字符,则会将硬停止编码到解析器中.为什么要实施此限制?虽然文档指定了这种行为,但它并不能证明原因.

vy3*_*y32 13

令人烦恼的是你不能这样做:

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

但你可以这样做:

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


use*_*ica 7

你似乎期待

'{}'.format("new\nline")
Run Code Online (Sandbox Code Playgroud)

f'{"new\nline"}'
Run Code Online (Sandbox Code Playgroud)

相当于.这不是我所期望的,并且不是f-strings中的反斜杠如何在Python 3.6的预发布版本中工作,其中允许使用大括号之间的反斜杠.那时候,你会收到一个错误,因为

"new
line"
Run Code Online (Sandbox Code Playgroud)

不是有效的Python表达式.

正如刚才所说,括号中的反斜杠令人困惑和模棱两可,并禁止它们以避免混淆:

这样做的目的是禁止令人费解的代码:

>>> d = {'a': 4}
>>> f'{d[\'a\']}'
'4'
Run Code Online (Sandbox Code Playgroud)

另外,我将禁止转义用于括号,如:

>>> f'\x7bd["a"]}'
'4'
Run Code Online (Sandbox Code Playgroud)

(其中chr(0x7b)=="{").

  • 大括号中的商定反斜杠会造成混淆,但是外面的反斜杠也不允许,这太糟糕了。此示例不令人困惑:`f“进行选择\ n A- {textA} \ n B- {textB} \ n C- {textC}”`。 (2认同)
  • @Guimoute你的不令人困惑的例子是完全合法的(至少在Python 3.7.8中): `f"Make your choice \n A- {textA} \n B- {textB} \n C- {textC}"` 。我相信反斜杠只在*大括号内是不允许的。 (2认同)

Gio*_*ous 6

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

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

  • 在所有平台上,“print”的正确行分隔符是“\n”,但在 Windows 上,“os.linesep”是“\r\n”([参考](https://docs.python.org /3/library/os.html#os.linesep))。我认为 `'\n' == chr(10)` 是有保证的,所以你可以写 `chr(10).join(...)`,尽管感觉很hacky。 (2认同)