如何使__missing__自动调用__getitem__ KeyError

时间:2016-11-11 00:35:11

标签: python magic-methods

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

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__钩子仅对扩展dict的类有用。在我的情况下它没有任何意义,我应该在try / except。

中实现缺少的功能

有没有办法让__getitem__自动拨打__missing__上的KeyError

1 个答案:

答案 0 :(得分:4)

the docs

  

object.__missing__(self, key)

     
    

当密钥不在字典中时,由dict.__getitem__()调用以实现dict子类的self[key]

  

基本上,如果您不是dict子类,或者您是,但是在没有将继承链委托给__getitem__的情况下重载dict.__getitem__,则__missing__表示什么都没有,因为没有人检查它。 除非您是__missing__子类,否则无法隐式调用dict

如果您正在编写自己的映射类,并且希望它执行类似__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)
相关问题