14

在 Python >=3.6 中,可以使用 f 字符串作为str.format方法的替代品。举个简单的例子,这些是等价的:

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

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

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

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

如果它在大括号内,我什至不能\用来分割长线;

f'{2+\
2}'     # illegal

即使在 normal 's\中完全允许这种用法;str

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

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

4

3 回答 3

12

你似乎期待

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

f'{"new\nline"}'

是等价的。这不是我所期望的,在 Python 3.6 的预发布版本中,f-strings 中的反斜杠不是如何工作的,其中允许大括号之间的反斜杠。那时,你会得到一个错误,因为

"new
line"

不是有效的 Python 表达式。

正如刚才所展示的,大括号中的反斜杠令人困惑和模棱两可,为了避免混淆,它们被禁止:

这样做的目的是禁止复杂的代码,例如:

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

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

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

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

于 2018-08-09T21:38:45.360 回答
6

你不能这样做很烦人:

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)}")
于 2021-03-02T15:36:06.650 回答
4

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

>>> import os
>>> 
>>> print(f"Numbers:\n{os.linesep.join(map(str, [10, 20, 30]))}")
Numbers:
10
20
30
于 2021-04-17T22:26:42.387 回答