问题描述
在将collections.defaultdict
与.format()
方法结合使用时,我得到了 KeyError
Shell执行
In [1]: from collections import defaultdict
In [2]: foo = "Foo: {foo}\nBar: {bar}"
In [3]: default = defaultdict(lambda: 0)
In [4]: foo.format(**default)
---------------------------------------------------------------------------
KeyError Traceback (most recent call last)
<ipython-input-4-799cab129cf2> in <module>
----> 1 foo.format(**default)
KeyError: 'foo'
由于我正在使用KeyError
,所以我不希望有defaultdict
。为什么会这样?
除此之外,我想用一些默认值填充foo
变量,我该怎么做?
解决方法
使用**
进行拆包会转换为真实的dict
(或功能上等效的不相关数据结构;实现细节非常丰富),因此defaultdict
的功能不会被使用。在这种情况下,您可以改为使用use str.format_map
,它接受(不解包)任意映射,而无需将其强制为dict
。正是出于这个目的而存在(引用文档:“例如,如果mapping
是dict的子类,这将很有用”):
In [5]: foo.format_map(default)
Out[5]: 'Foo: 0\nBar: 0'