python OrderedDefaultDict 的实现

转载 2016年08月31日 10:54:31
class OrderedDefaultDict(collections.OrderedDict):
    def __init__(self, *args, **kwargs):
        if not args:
            self.default_factory = None
        else:
            if not (args[0] is None or callable(args[0])):
                raise TypeError('first argument must be callable or None')
            self.default_factory = args[0]
            args = args[1:]
        super(OrderedDefaultDict, self).__init__(*args, **kwargs)

    def __missing__(self, key):
        if self.default_factory is None:
            raise KeyError(key)
        self[key] = defualt = self.default_factory()
        return default

    def __reduce__(self):
        args = (self.default_factory,) if self.default_factory else ()
        return self.__class__, args, None, None, self.iteritems()

__missing__():

missing 主要是defaultdict类中实现默认值的功能,
使用

print defaultdict.__missing__.__doc__

missing(key)
if self.default_factory is None: raise KeyError(key)
self[key] = value = self.default_factory()
return value

通过查看_ _ missing _ ()方法的docstring, 可以看出,当使用 _ getitem _ 方法访问一个不存在的键的时候,会调用 _ missing _ _ 方法来获取默认值,并将该值添加到字典中去

而且查看官方文档发现,

If a subclass of dict defines a method missing() and key is not present, the d[key] operation calls that method with the key key as argument. The d[key] operation then returns or raises whatever is returned or raised by the missing(key) call. No other operations or methods invoke missing(). If missing() is not defined, KeyError is raised. missing() must be a method; it cannot be an instance variable:

虽然dict支持 miss 方法,但是该方法在dict本身是不存在的,而是需要在派生的子类中自行实现这个方法,可以简单的验证这一点:

print dict.__missing__.__doc__

同时,我们可以进一步的做实验,定义一个子类,并且实现 missing方法

class Missing(dict)
    def __missing__(self, key):
        return 'missing'

d = Missing()
>>>d
{}
>>>d['foo']
'missing'
>>>d
{}

返回结果反映了,missing方法确实发挥了作用,在此基础上,我们稍作修改就可以使得该子类同defaultdict类一样为不存在的键设置一个默认值

__reduce__self

当定义扩展类型的时候(也就是使用python的C语言API实现的类型), 如果你想要pickle(持久化对象)它们,你必须告诉python如何pickle它们,reduce被定义之后,当对象被pickle的时候就会被调用,它要么返回一个代表全局名称的字符串,python会查找它并且pickle,要么返回一个元组,这个元组包含2到5个元素,其中包括:一个可调用对象,用于重建对象的时候调用,一个参数元素,供那个可调用对象使用,被传递给 _ _ setstate _ _ 的状态(可选); 一个产生被pickle的列表元素的迭代器(可选) 一个产生pickle的字典元素的迭代器

相关文章推荐

python实现高斯列组元消元

  • 2017年11月09日 22:00
  • 2KB
  • 下载

机器学习经典算法详解及Python实现--决策树(Decision Tree)

决策树也是最经常使用的数据挖掘算法,决策树分类器就像判断模块和终止块组成的流程图,终止块表示分类结果(也就是树的叶子)。判断模块表示对一个特征取值的判断(该特征有几个值,判断模块就有几个分支)。决策树...

Python实现跨平台运维小神器

这阵子一直在学python,碰巧最近想把线上服务器环境做一些规范化/统一化,于是便萌生了用python写一个小工具的冲动。就功能方面来说,基本上是在“重复造轮子”吧,但是当我用这小工具完成了30多台服...
  • kai404
  • kai404
  • 2016年08月10日 11:59
  • 2032

python学习记录_____2048游戏实现

  • 2017年08月12日 02:46
  • 27KB
  • 下载

用Python实现最速下降法求极值

对于一个多元函数f(x)=f(x1,x2,⋯,xn)f(x)=f(x_{1},x_{2},\cdots,x_{n}),用最速下降法(又称梯度下降法)求其极小值的迭代格式为 xk+1=xk+αkdkx...

websocket Server Python实现

  • 2017年08月24日 22:06
  • 3KB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:python OrderedDefaultDict 的实现
举报原因:
原因补充:

(最多只允许输入30个字)