为啥 Python 在格式化时将此字符串解释为字典? [复制]

Posted

技术标签:

【中文标题】为啥 Python 在格式化时将此字符串解释为字典? [复制]【英文标题】: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ᴘᴇᴇᴅ 对我来说已经足够了。 【参考方案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)

【讨论】:

以上是关于为啥 Python 在格式化时将此字符串解释为字典? [复制]的主要内容,如果未能解决你的问题,请参考以下文章

为啥threading.thread将空字典传递给python中的函数线程

python中为啥用json有啥作用

使用“加载文件数据”时将真假字符串转换为布尔值

python实现将固定格式的字符串调整为字典的格式,用于爬虫爬取数据时快速添加请求数据

python实现将固定格式的字符串调整为字典的格式,用于爬虫爬取数据时快速添加请求数据

python-将字符串转换为字典