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 OrderedDefaultDict 的实现

ordereddefaultdict

模拟实现栈

**模拟实现栈** #include #include #include using namespace std; template class Stack { public: Stack(s...

我是如何成为一名python大咖的?

人生苦短,都说必须python,那么我分享下我是如何从小白成为Python资深开发者的吧。2014年我大学刚毕业..

ConcurrentHashMap学习笔记

ConcurrentHashMap为线程同步的Map实现,并采用了分段锁的设计,分段锁称为Segment,它即类似于HashMap的结构,即内部拥有一个Entry数组,数组中的每个元素又是一个链表;同...

栈的实现 -- 顺序栈和链式栈(C++描述)

栈的ADT C++描述:#ifndef STACKADT_H #define STACKADT_Htemplate class Stack{ private: void operator =...

51单片之LED的点亮

上篇文章说到硬件,这里补充一下,我是买的最小系统,很多东西都是自己焊接的,所以还需要烙铁什么的,也可以买集成板,淘宝上很多。 这篇文章用C语言实现LED的点亮: 代码很简单,注意看注释,我都写好了...
  • sum_TW
  • sum_TW
  • 2017-02-23 23:20
  • 2284

(十一)StringBuffer的实现

StringBuffer MyStringBuffer与MyString的不同之处是:对于MyString类的连接,插入和删除子串成员函数都是不改变原对象的串值。但对于MyStringBuffer类...

c++primer读书笔记(6)

第十章的总结: 1.如果可以通过初始化,也可以通过赋值来设置对象的值,应采取初始化,通常效率会更高。 2.在函数声明后面加上const,可以确保不能在函数内更改属性值。 3.用户自己定义的数据类...

ConcurrentHashMap的实现原理与使用

ConcurrentHashMap是线程安全且高效的HashMap。 在并发编程中使用HashMap可能导致程序死循环。而使用,线程安全的HashTable效率又非常低下,基于以上原因便有了Conc...

栈的实现

头文件 #ifndef __MYSTACK_H__ #define __MYSTACK_H__ typedef struct Node{ int data; Node *Next; }No...

自己实现一个栈(Stack)和队列(Queue)

需求实现一个栈(Stack)和队列(Queue). 栈:后进先出 队列:先进先出
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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