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

时间:2017-09-11 14:21:59

标签: python string python-3.x string-formatting

我在使用带有类似Python字典的字符串的format时遇到问题。

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

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

解释器抛出KeyError:

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

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

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

3 个答案:

答案 0 :(得分:17)

'{"one": {}}'的格式为using an identifier as the field_name,基本上会尝试查找已提供给.format并且名称为'"one"'的关键字参数。

正如文档所述:

  

field_name本身以arg_name开头,KeyError是数字或关键字。如果是数字,则表示位置参数,如果是关键字,则表示命名关键字参数。

(强调我的)

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

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

f

如果您决定在将来使用>>> f'{{"one": {1}}}' '{"one": 1}' 字符串,则适用相同的补救措施:

<div class="down">

答案 1 :(得分:13)

你需要加倍大括号}} a= '{{"one":{}}}'.format(1) 来摆脱字符串格式的大括号。

{}

来自doc

  

格式字符串包含由大括号括起的“替换字段”   {{。任何未包含在大括号中的内容都被视为文字   文本,未更改地复制到输出。如果你需要包括   文字文本中的大括号字符,可以通过加倍来转义:   }}str.format()

如果你没有转义大括号,'"one"'会查找键b = '{"one"} foo'.format(**{'"one"':1}) print(b) # 1 foo 的值来格式化字符串。例如:

{{1}}

答案 2 :(得分:1)

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

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