因此,defaultdict 文档提到,如果缺少某个项目,则default_factory
“将其返回的值插入到键的字典中,并返回”。大多数时候这很好,但在这种情况下我真正想要的是返回值但不插入到 defaultdict 中。
我想我可能可以继承 defaultdict 并覆盖......我猜__missing__
?没有把握。解决这个问题的最佳方法是什么?
提前致谢。
因此,defaultdict 文档提到,如果缺少某个项目,则default_factory
“将其返回的值插入到键的字典中,并返回”。大多数时候这很好,但在这种情况下我真正想要的是返回值但不插入到 defaultdict 中。
我想我可能可以继承 defaultdict 并覆盖......我猜__missing__
?没有把握。解决这个问题的最佳方法是什么?
提前致谢。
您可以子类化dict
并实现__missing__
:
class missingdict(dict):
def __missing__(self, key):
return 'default' # note, does *not* set self[key]
演示:
>>> d = missingdict()
>>> d['foo']
'default'
>>> d
{}
您也可以子类defaultdict
化,您将获得工厂处理以及复制和泡菜支持:
from collections import defaultdict
class missingdict(defaultdict):
def __missing__(self, key):
return self.default_factory()
演示:
>>> from collections import defaultdict
>>> class missingdict(defaultdict):
... def __missing__(self, key):
... return self.default_factory()
...
>>> d = missingdict(list)
>>> d['foo']
[]
>>> d
defaultdict(<type 'list'>, {})
但是,正如你所看到的,__repr__
它的名字确实是谎言。
它甚至比子类化更简单。虽然dict[key]添加键,但dict.get(key, default=None)不会将键添加到字典中:
import collections
d = collections.defaultdict(int)
assert d['test1'] == 0
print(d)
# defaultdict(<class 'int'>, {'test1': 0})
assert d.get('test2', 0) == 0
# for a more generic version, use `d.default_factory()` instead of 0
print(d)
# defaultdict(<class 'int'>, {'test1': 0})
# => did NOT insert a key for 'test2' =)