我正在编写一个模拟映射对象的类。它具有以下功能。
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
?
答案 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)