zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    hadoop中使用hprof工具进行性能分析
    hadoop map端的超时参数
    一次hadoop集群机器加内存的运维过程
    算法学习-回溯法
    项目中Map端内存占用的分析
    hadoop Shuffle Error OOM错误分析和解决
    算法学习-动态规划
    项目中Map端数据处理不均匀性分析
    《Hadoop技术内幕》读书笔记——Task运行过程分析
    jsp里更新Clob类型字段数据
  • 原文地址:https://www.cnblogs.com/geeklove01/p/8747653.html
Copyright © 2011-2022 走看看