为什么Python在格式化时将此字符串解释为字典?

use*_*462 11 python string string-formatting python-3.x

我在使用format看起来像Python字典的字符串时遇到问题.

我想生成以下字符串:{"one":1} 如果我尝试这样做:

'{"one":{}}'.format(1)
Run Code Online (Sandbox Code Playgroud)

解释器抛出一个KeyError:

>>> a = '{"one":{}}'.format(1)
Traceback (most recent call last):
    File "<stdin>", line 1, in <module>
KeyError: '"one"'
Run Code Online (Sandbox Code Playgroud)

据我所知,这个问题大概在该字符串中包含的事实围绕{,可以用混淆format{}.为什么会发生这种情况,如何解决?

我知道百分比格式,但我想找到一个不涉及开沟的解决方案format().

Jim*_*ard 17

的格式'{"one": {}}'使用标识符作为field_name和将主要试图寻找一个已经提供给关键字参数.format,并命名'"one"'.

正如文档所述:

field_name本身以arg_name数字或关键字开头.如果它是一个数字,它引用一个位置参数,如果它是一个关键字,它引用一个命名关键字参数.

(强调我的)

这就是你得到KeyError例外的原因; 它试图在提供给关键字参数的映射中查找关键字format.(在这种情况下,它是空的,因此错误).

作为解决方案,只需逃避外部花括号:

>>> '{{"one":{}}}'.format(1)
'{"one":1}'
Run Code Online (Sandbox Code Playgroud)

如果您决定在f将来使用-strings,则适用相同的补救措施:

>>> f'{{"one": {1}}}'
'{"one": 1}'
Run Code Online (Sandbox Code Playgroud)


flo*_*urr 13

你需要加倍花括号{{ }}来转义字符串格式的花括号.

a= '{{"one":{}}}'.format(1)
Run Code Online (Sandbox Code Playgroud)

来自doc:

格式字符串包含由大括号括起的"替换字段" {}.大括号中未包含的任何内容都被视为文本文本,它将不加改变地复制到输出中.如果你需要在文字文本中包含一个大括号字符,可以通过加倍来转义它: {{}}.

如果你没有转义大括号,str.format()将查找key的值'"one"'来格式化字符串.例如:

b = '{"one"} foo'.format(**{'"one"':1})
print(b) # 1 foo
Run Code Online (Sandbox Code Playgroud)