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

Why is Python interpreting this string as a dictionary when formatting?

本问题已经有最佳答案,请猛点这里访问。

我在使用一个类似于Python字典的字符串时遇到了问题。

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

1
'{"one":{}}'.format(1)

解释器抛出一个键错误:

1
2
3
4
>>> a = '{"one":{}}'.format(1)
Traceback (most recent call last):
    File"<stdin>", line 1, in <module>
KeyError: '"one"'

我理解,这个问题可能是围绕着字符串包含{,这可以与format{}混淆。为什么会发生这种情况?如何解决?

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


'{"one": {}}'的格式是使用标识符作为field_name,基本上会尝试查找已提供给.format且名称为'"one"'的关键字参数。

如文件所述:

The field_name itself begins with an arg_name that is either a number or a keyword. If it’s a number, it refers to a positional argument, and if it’s a keyword, it refers to a named keyword argument.

(emphasis mine)

这就是为什么您得到KeyError异常的原因;它试图在提供给format的关键字参数映射中寻找一个键。(在这种情况下,它是空的,因此是错误的)。

作为一种解决方案,只需避开外部大括号:

1
2
>>> '{{"one":{}}}'.format(1)
'{"one":1}'

如果您决定将来使用f字符串,则同样的补救方法也适用:

1
2
>>> f'{{"one": {1}}}'
'{"one": 1}'


您需要双大括号{{}}来避免字符串格式中的大括号。

1
a= '{{"one":{}}}'.format(1)

来自DOC:

Format strings contain"replacement fields" surrounded by curly braces
{}. Anything that is not contained in braces is considered literal
text, which is copied unchanged to the output. If you need to include
a brace character in the literal text, it can be escaped by doubling:
{{ and }}.

如果不转义大括号,str.format()将查找键'"one"'的值以格式化字符串。例如:

1
2
b = '{"one"} foo'.format(**{'"one"':1})
print(b) # 1 foo


大括号可以使用双大括号转义,使用:

1
'{{"one":{}}}'.format(1)