This question already has answers here:
How to properly subclass dict and override __getitem__ & __setitem__
(6个答案)
2年前关闭。
我正在阅读Fluent Python,并试图对字典有更深入的了解。
因此,当我运行以下命令时,结果很容易理解,因为get()和dunder getitem()都返回相同的结果
当我用get()将dict子类化时,我得到了一个工作实例
现在,如果我用dunder getitem()替换get(),则会出现错误,并且不确定为什么。
错误
所以问题是,在这种情况下,get和dunder getitem有什么区别,为什么这会导致递归错误?
(6个答案)
2年前关闭。
我正在阅读Fluent Python,并试图对字典有更深入的了解。
因此,当我运行以下命令时,结果很容易理解,因为get()和dunder getitem()都返回相同的结果
sample = {'a':1, 'b':2}
print(sample.__getitem__('a')) # 1
print(sample.get('a')) # 1
当我用get()将dict子类化时,我得到了一个工作实例
class MyDict(dict):
def __missing__(self, key):
return 0
def get(self, key):
return self[key]
d = MyDict(sample)
print(d['a']) # 1
print(d['c']) # 0
现在,如果我用dunder getitem()替换get(),则会出现错误,并且不确定为什么。
class MyDict2(dict):
def __missing__(self, key):
return 0
def __getitem__(self, key):
return self[key]
d = MyDict2(sample)
print(d['a'])
print(d['c'])
错误
RecursionError: maximum recursion depth exceeded while calling a Python object
所以问题是,在这种情况下,get和dunder getitem有什么区别,为什么这会导致递归错误?
最佳答案
这是因为self[key]
中的MyDict2.__getitem__(key)
等效于(即,调用)self.__getitem__(key)
=>无限递归。
关于python - get和dunder getitem之间的区别,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/50585532/
10-12 18:12