Python __missing__

来源:互联网 发布:云计算 企业排名 编辑:程序博客网 时间:2024/06/09 22:09

According to the python documentation:


If a subclass of dict defines a method __missing__(), if the key 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 if the key is not present. 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.


For an example, see collections.defaultdict.


This is, at least, incomplete, since __missing__ must not only return the default value, but also assign it internally. This is made clear in the documentation for collections.defaultdict:


If default_factory is not None, it is called without arguments to provide a default value for the given key, this value is inserted in the dictionary for the key, and returned.

Surprisingly, the __missing__ method is not mentioned in the special method names section of the python documentation.

class memoize(dict):    def __init__(self, func):        self.func = func    def __call__(self, *args):        print "__call__"        return self[args]    def __missing__(self, key):        print "__missing__"        result = self[key] = self.func(*key)        return result@memoizedef foo(a, b):    return a * bprint foo(1,2)print foo(1,2)print foo(1,2)print foo(1,2)print foo(1,2)print foo(1,2)

执行结果:

__call____missing__2__call__2__call__2__call__2__call__2__call__2



0 0