【问题标题】:Why is Python interpreting this string as a dictionary when formatting? [duplicate]为什么 Python 在格式化时将此字符串解释为字典? [复制]
【发布时间】:2018-02-19 19:55:47
【问题描述】:

我在将format 与一个看起来像 Python 字典的字符串一起使用时遇到问题。

我想生成以下字符串:{"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() 的解决方案。

【问题讨论】:

  • 请记住,比百分比格式更快:format=0.7228269569986878, %=0.03355357599866693(您的示例中timeit.timeit的结果)
  • @YaroslavSurzhikov 除非您生成大量字符串,否则我认为这并不重要。
  • 如果要制作字典字符串,可以考虑str({"one":1})
  • 注意:即使问题不相同,如果答案解释了某事的原因,it still qualifies
  • @cᴏʟᴅsᴘᴇᴇᴅ 对我来说已经足够了。

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


【解决方案1】:

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

如文档所述:

field_name 本身以 arg_name 开头,它可以是数字也可以是关键字。如果是数字,则引用位置参数,如果是关键字,则引用命名关键字参数。

(强调我的)

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

作为一种解决方案,只需将外部花括号转义即可:

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

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

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

【讨论】:

  • 啊!我知道转义是问题所在,但我使用的是 `` 转义,而不是双花括号。谢谢!
【解决方案2】:

您需要双花括号 {{ }} 以在字符串格式中转义花括号。

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

来自doc

格式字符串包含用大括号括起来的“替换字段” {}。大括号中未包含的任何内容都被视为文字 文本,原封不动地复制到输出中。如果您需要包括 文本中的大括号字符,可以通过加倍来转义: {{}}.

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

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

【讨论】:

    【解决方案3】:

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

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

    【讨论】:

      猜你喜欢
      • 2011-05-30
      • 2013-06-14
      • 1970-01-01
      • 2019-01-08
      • 1970-01-01
      • 1970-01-01
      • 2013-03-03
      • 2018-04-25
      • 2021-06-17
      相关资源
      最近更新 更多