如何让 __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)
我正在编写一个模拟映射对象的 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 implementself[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)