Python中的defaultdict和魔术方法 __missing__,

Python中的defaultdict可用于给所有的key赋一个默认的value

这样当访问的key对应的value不存在的时候,可以返回一个默认值

一些defaultdict的用法:

dd = defaultdict(list)

def zero():
    return 0
dd = defaultdict(zero)

dd = defaultdict(lambda: 0)

defaultdict的实现使用了魔术方法:__missing__()

通过如下操作:

>>> from collections import defaultdict
>>> print defaultdict.__missing__.__doc__
__missing__(key) # Called by __getitem__ for missing key; pseudo-code:
  if self.default_factory is None: raise KeyError((key,))
  self[key] = value = self.default_factory()
  return value

可以看出当使用__getitem__来访问一个不存在的key的时候,会调用__miss__()方法获取默认值,并将该值添加到字典中去

从这里 https://docs.python.org/3/library/stdtypes.html#dict 可以得知,dict中不存在__missing__()方法,需要在派生的子类中自己实现这个方法

举个例子:

def Missing(dict):
    def __missing__(self, key):
        self[key] = 'default'   # 若不加这一句,对Missing这个dict来说是有很大区别的
        return 'default'

由于defaultdict类是从2.5版本之后才添加的,一个在2.5之前版本调用defaultdict的写法是这样的:

try:
    from collections import defaultdict
except ImportError:
    class defaultdict(dict):
      def __init__(self, default_factory=None, *a, **kw):
          dict.__init__(self, *a, **kw)
          self.default_factory = default_factory

      def __getitem__(self, key):
          try:
              return dict.__getitem__(self, key)
          except KeyError:
              return self.__missing__(key)

      def __missing__(self, key):
          self[key] = value = self.default_factory()
          return value

总结自:http://kodango.com/understand-defaultdict-in-python