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)
你似乎期待
'{}'.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表达式.
正如刚才所说,括号中的反斜杠令人困惑和模棱两可,并禁止它们以避免混淆:
这样做的目的是禁止令人费解的代码:
Run Code Online (Sandbox Code Playgroud)>>> d = {'a': 4} >>> f'{d[\'a\']}' '4'
另外,我将禁止转义用于括号,如:
Run Code Online (Sandbox Code Playgroud)>>> f'\x7bd["a"]}' '4'
(其中chr(0x7b)=="{").
对于新行,您可以使用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)