拆包时defaultdict提高KeyError

问题描述

在将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'