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

新手上路,请多包涵

在 Python >=3.6 中,f-strings 可以用作 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

即使 --- 的这种用法在正常的 str \ 中是完全允许的;

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

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

原文由 jmd_dk 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 2k
2 个回答

你似乎期待

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

f'{"new\nline"}'

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

"new
line"

不是有效的 Python 表达式。

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

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

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

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

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

(其中 chr(0x7b) == “{”)。

原文由 user2357112 发布,翻译遵循 CC BY-SA 4.0 许可协议

你不能这样做很烦人:

 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)}")

原文由 vy32 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题