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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM