为什么不能在 f 字符串中使用反斜杠?
Why isn't it possible to use backslashes in f-strings?
在Python>=3.6中,f-strings可以作为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 指定了此行为,但并未说明原因。
你似乎在期待
'{}'.format("new\nline")
和
f'{"new\nline"}'
等价。这不是我所期望的,也不是 f 字符串中的反斜杠在 Python 3.6 的预发布版本中的工作方式,其中允许在大括号之间使用反斜杠。那时候,你会得到一个错误,因为
"new
line"
不是有效的 Python 表达式。
正如刚才所展示的,大括号中的反斜杠容易混淆和歧义,banned 以避免混淆:
The point of this is to disallow convoluted code like:
>>> d = {'a': 4}
>>> f'{d[\'a\']}'
'4'
In addition, I'll disallow escapes to be used for brackets, as in:
>>> f'\x7bd["a"]}'
'4'
(where chr(0x7b) == "{").
很烦你不能这样做:
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)}")
对于新行,您可以使用os.linesep
代替\n
。例如:
>>> import os
>>>
>>> print(f"Numbers:\n{os.linesep.join(map(str, [10, 20, 30]))}")
Numbers:
10
20
30
在Python>=3.6中,f-strings可以作为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 指定了此行为,但并未说明原因。
你似乎在期待
'{}'.format("new\nline")
和
f'{"new\nline"}'
等价。这不是我所期望的,也不是 f 字符串中的反斜杠在 Python 3.6 的预发布版本中的工作方式,其中允许在大括号之间使用反斜杠。那时候,你会得到一个错误,因为
"new
line"
不是有效的 Python 表达式。
正如刚才所展示的,大括号中的反斜杠容易混淆和歧义,banned 以避免混淆:
The point of this is to disallow convoluted code like:
>>> d = {'a': 4} >>> f'{d[\'a\']}' '4'
In addition, I'll disallow escapes to be used for brackets, as in:
>>> f'\x7bd["a"]}' '4'
(where chr(0x7b) == "{").
很烦你不能这样做:
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)}")
对于新行,您可以使用os.linesep
代替\n
。例如:
>>> import os
>>>
>>> print(f"Numbers:\n{os.linesep.join(map(str, [10, 20, 30]))}")
Numbers:
10
20
30