为什么在 f-strings 的大括号内不能使用反斜线?我该如何解决这个问题?

20 浏览
0 Comments

为什么在 f-strings 的大括号内不能使用反斜线?我该如何解决这个问题?

这个问题已经有了答案:

如何在f字符串中使用换行符\'\\n\'格式化输出?

在Python >=3.6中,f-strings可以用作str.format方法的替代品。作为一个简单的例子,它们是等价的:

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

忽略格式说明符,我可以在f字符串中将str.format的位置参数放在大括号内。特别注意的是,我可以在这里放置str字面量,尽管这可能有点不便。

然而,有一些限制。具体来说,任何形式的反斜杠都不能出现在f字符串的大括号内:

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

甚至我不能使用\\来拆分一个长行,如果它在大括号内;

f'{2+\
2}'     # illegal

即使这种用法在普通的str中也是完全允许的;

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

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

admin 更改状态以发布 2023年5月23日
0
0 Comments

很烦人,你不能这样做:

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

0
0 Comments

你似乎期望

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

f'{"new\nline"}'

是等价的。这并不是我所期望的,也不是在 Python 3.6 的预发行版本中反斜杠在 f-string 中的工作方式。在大括号之间使用反斜杠是允许的。那时候,你会因为

"new
line"

不是有效的 Python 表达式而出错。

正如刚才所演示的那样,大括号中的反斜杠是令人困惑和模棱两可的,而它们被禁止以避免混淆:

这样做的目的是禁止像这样的复杂代码:

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

此外,我还将禁止使用反斜杠来表示括号,如:

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

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

0