在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指定了这种行为,但并不能说明原因。
答案 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