SyntaxError: f-string 表达式部分不能包含反斜杠

use*_*293 4 python django

我有这个api调用。

payload = "{\\"weight\\":{\\"value\\":\\"85.00\\",\\"unit\":\\"kg\\"},\\"height\\":{\\"value\\":\\"170.00\\",\\"unit\\":\\"cm\\"},\\"sex\\":\\"m\\",\\"age\\":\\"24\\",\\"waist\\":\\"34.00\\",\\"hip\\":\\"40.00\\"}"
Run Code Online (Sandbox Code Playgroud)

我想使用 af 字符串来更改这些值,但出现语法错误,提示我不能对 f 字符串使用反斜杠。我能做什么?

Amp*_*cid 8

这是目前在 python 中 f-strings 的一个限制。它们中根本不允许使用反斜杠(请参阅https://mail.python.org/pipermail/python-dev/2016-August/145979.html

选项1

最好的方法是使用 usestr.format()来完成此操作,根据https://docs.python.org/3/library/stdtypes.html#str.format

选项 2

如果你非常喜欢使用反斜杠,你可以这样做:

backslash_char = "\\"
my_string = f"{backslash_char}foo{bar}"
Run Code Online (Sandbox Code Playgroud)

但这可能不是让您的代码对其他人可读的最佳方式。

选项 3

如果您绝对确定您永远不会使用特定字符,您也可以将该字符作为占位符放入,例如

my_string = f"foo{bar}".replace("", "\\")
Run Code Online (Sandbox Code Playgroud)

但这也是超级解决方法。如果您收到包含该字符的输入,那么这是一种在未来引入错误的好方法。

选项 4

正如对此答案的评论中所述,另一种选择是chr(92)在一些卷曲中进行,如下所示:

my_string = f"This is a backslash: {chr(92)}"
Run Code Online (Sandbox Code Playgroud)

  • `chr(10)` 如果您尝试在 f 字符串中获取新行 (`\n`) (23认同)
  • 你让我在。 (15认同)
  • 您还可以使用 `chr(92)` (92 是反斜杠的 ASCII 代码) (9认同)
  • 实际上你可以将你想要真正打印的“{”或“}”加倍,就像`print(f"really show this {{")` (2认同)
  • 这个答案对于 python 3.10 是不正确的。正如错误消息所述,限制仅针对 f 字符串的 *表达式* 部分中的反斜杠序列。 (2认同)
  • 我很惊讶这个限制是故意的。它背后没有技术问题,它只是为了“避免复杂的代码”而存在。我不认为插入更多引用本地字符串的“{}”比转义序列更简单。 (2认同)