如何在f-strings中转义花括号?

307

我有一个字符串,希望其中包含花括号,并利用f-strings功能。是否有一些语法可以实现这一点?

以下是两种无法实现的方式。我想在字符串中包含文字 {bar}

foo = "test"
fstring = f"{foo} {bar}"

NameError: name 'bar' is not defined

fstring = f"{foo} \{bar\}"

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

'test {bar}'

编辑:看起来这个问题的答案与如何在Python字符串中打印字面大括号字符并同时使用.format相同,但只有当您知道str.format使用与f字符串相同的规则时,才能知道。因此,希望这个问题对于绑定f字符串搜索者到这个答案具有价值。


21
您可以将'{'和'}'替换为它们对应的代码点\u007b\u007d。例如,print(' \u007b \u007d')会得到{ } - XX 吕
2
@stefanct 你说的“不起作用”是指什么? f'{{1{2}' 正确返回 '{12',不是吗? - wim
1
是的,但有很多情况下它不起作用,例如 f'{{}' -> SyntaxError: f-string: single '}' is not allowed - stefanct
1
@stefanct仍然没有看到问题-您认为应该返回什么?如果您没有格式化任何字段,为什么要使用f前缀? - wim
4
是的,我没有明白你的意思,因为你没有举出例子来说明你的意思。仅仅格式化一个括号“不起作用”显然是不正确的,“f"{{{name}"”会给出一个带有单个前导括号的格式化字符串,并与数字文字无关。 - wim
显示剩余2条评论
1个回答

455
尽管解析器出现了自定义语法错误,但相同的技巧适用于对普通字符串调用.format
请使用双大括号:
>>> foo = 'test'
>>> f'{foo} {{bar}}'
'test {bar}'

在规范这里和文档这里中提到过。


18
如果您需要输出双花括号,请使用四个花括号:f'{foo} {{{{bar}}}}' - stackprotector
17
如果想将变量的值用 { } 包裹起来,该怎么做? - GeorgeIrwin
这样的东西在JINJA模板中能行得通吗? - juntunen
6
@GeorgeIrwin 用三个大括号就能解决这个问题。 - Zach Rieck

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接