Python 2 __missing__方法

Sea*_*hot 1 python dictionary python-2.x dictionary-missing

我写了一个非常简单的程序来子类化字典.我想__missing__在python中尝试该方法.经过一些研究后我发现在Python 2中可用defaultdict.(在python 3中我们使用collections.UserDict虽然..)如果找不到密钥,则__getitem__负责调用该__missing__方法.

当我__getitem__在下面的程序中实现时,我得到一个关键错误,但是当我没有它实现时,我得到了所需的值.

import collections
class DictSubclass(collections.defaultdict):

    def __init__(self,dic):
        if dic is None:
            self.data = None
        else:
            self.data = dic

    def __setitem__(self,key,value):
        self.data[key] = value

    ########################
    def __getitem__(self,key):
        return self.data[key]
    ########################

    def __missing__(self,key):
        self.data[key] = None

dic = {'a':4,'b':10}
d1 = DictSubclass(dic)
d2 = DictSubclass(None)    
print  d1[2]
Run Code Online (Sandbox Code Playgroud)

我认为我需要实施,__getitem__因为它负责呼叫__missing__.据我所知,defaultdict的类定义有一个__getitem__方法.但即便如此,说我想写自己的__getitem__,我该怎么做?

Mar*_*ers 9

dict类型将始终尝试调用__missing__.所有这一切defaultdict都提供了一个实现; 如果您提供自己的__missing__方法,则根本不必进行子类化defaultdict.

查看dict文档:

d[key]
用钥匙 返回d .引发KeyErrorif 不在地图中.

如果dict的子类定义了方法__missing__()并且不存在,则该d[key]操作使用键作为参数调用该方法.然后d[key]操作返回或引发__missing__(key)调用返回或引发的任何内容.没有其他操作或方法调用__missing__().

但是,您需要保留默认__getitem__方法,或者至少调用它.如果您dict.__getitem__使用自己的版本覆盖而不调用基础实现,__missing__则永远不会调用.

你可以__missing__从你自己的实现中调用:

def __getitem__(self, key):
    if key not in self.data:
        return self.__missing__(key)
    return self.data[key]
Run Code Online (Sandbox Code Playgroud)

或者您可以调用原始实现:

def __getitem__(self, key):
    if key not in self.data:
        return super(DictSubclass , self).__getitem__(key)
    return self.data[key]
Run Code Online (Sandbox Code Playgroud)

在Python 2中,您可以只是子类UserDict.UserDict:

from UserDict import UserDict

class DictSubclass(UserDict):
    def __missing__(self, key):
        self.data[key] = None
Run Code Online (Sandbox Code Playgroud)