为啥 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实现将固定格式的字符串调整为字典的格式,用于爬虫爬取数据时快速添加请求数据