如何从dict调用__missing__

时间:2016-01-19 18:32:21

标签: python oop python-3.x dictionary

我想从dict派生并覆盖缺少的方法。我想做一些东西然后仍然调用它的超级功能。像这样:

class Foo(dict):
    def __missing__(self, key):
        print('missing {}'.format(key))
        return super().__missing__(key)
然而,

产生了:

AttributeError: 'super' object has no attribute '__missing__'

当然,我仍然可以使用以下方式制作一个有效的程序:

raise KeyError(key)

但我更愿意称之为超级功能。因为代码可以(或者可能在将来的python版本中)在super().__missing__中执行,而不是引发KeyError。

2 个答案:

答案 0 :(得分:7)

没有dict.__missing__;只需将通话转至super().__missing__(并提出KeyError)即可。该方法是可选,没有默认实现。

或者,如果要正确支持多重继承,可以捕获AttributeError异常:

class Foo(dict):
    def __missing__(self, key):
        print('missing {}'.format(key))
        try:
            return super().__missing__(key)
        except AttributeError:
            raise KeyError(key)

答案 1 :(得分:0)

来自collections.defaultdict

子类,其中已经包含缺少方法。

https://docs.python.org/3/library/collections.html#collections.defaultdict

  

__missing__

     

如果default_factory属性为None,则会以作为参数引发KeyError异常。

     

如果default_factory不是None,则调用它而不带参数   为给定的键提供默认值,插入此值   的字典,并返回。

     

如果调用default_factory引发异常,则此异常为   传播不变。

     

此方法由dict类的__getitem__()方法调用   何时找不到所请求的密钥;无论它返回或加注是什么   然后由__getitem__()返回或提出。

     

请注意__missing__()   __getitem__()。这意味着get()会像普通词典一样将None作为默认值而不是default_factory返回。