如何让 __missing__ 自动调用 __getitem__ KeyError

How to make __missing__ automatically called on __getitem__ KeyError

我正在编写一个模拟映射对象的 class。它具有以下功能。

class MyClass(object):
    def __init__(self):
        self.vars = {}

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

    def __missing__(self,key):
        return key

我认为调用 obj[missing_key] 也会调用 __missing__。但是因为我已经覆盖 __getitem__ 我必须这样做

def __getitem__(self,key):
    try:
        return self.vars[key]
    except KeyError as e:
        return self.__missing__(key)

__missing__ 钩子似乎没有包含在对 __getitem__ 的调用中,而是内置在 __getitem__ 中。这使得 __missing__ 钩子仅对扩展字典的 classes 有用。就我而言,这没有任何意义,我应该只在 try/except.

中实现缺少的功能

有没有办法让 __getitem__KeyError 上自动调用 __missing__

根据 the docs:

object.__missing__(self, key)

Called by dict.__getitem__() to implement self[key] for dict subclasses when key is not in the dictionary.

基本上,如果您不是 dict 子 class,或者您是,但您在没有将继承链向上委托给 dict.__getitem__ 的情况下超载了 __getitem__,然后 __missing__ 没有任何意义,因为没有任何检查。 除非你是 dict subclass.

,否则你不能让它隐式调用 __missing__

如果您正在编写自己的映射 class,并且希望它执行类似 __missing__ 的操作,那么您根本不需要 __missing__,只需将处理代码放入 __getitem__:

def __getitem__(self, key):
    try:
        return self.var[key]
    except KeyError:
        return key

这符合您的预期(注意:它不会更新 self.var)。您可以使用 dict.get 将其缩短为:

def __getitem__(self, key):
    return self.var.get(key, key)