是否可以创建一个尚不存在的键值,重新加载方法__ getitem __?
我试试:
class Dict_(dict):
def __getitem__(self, key):
if key in self:
self[key] = {}
return self[key]
else:
return self[key]
我理解为什么堆栈溢出, 但我不明白为什么没有溢出
class Dict_(dict):
def __getitem__(self, key):
if key not in self:
self[key] = {}
return self.get(key)
else:
return self.get(key)
参见说明并看到使用get时也使用__ getitem__ - D [k]
D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.
请告诉我,如何通过__getitem__
完成我想要的工作?
答案 0 :(得分:5)
您需要拨打原始 __getitem__
;使用self[key]
调用顶级__getitem__
并创建无限递归。
这样做:
class Dict_(dict):
def __getitem__(self, key):
if key not in self:
self[key] = {}
return super(Dict_, self).__getitem__(key)
请注意,内置的Python dict
类型已经支持您的用例;如果您定义__missing__()
method,它将自动调用:
class Dict_(dict):
def __missing__(self, key):
self[key] = {}
return self[key]
这是collections.defaultdict()
所做的,提供调用提供的工厂方法的__missing__
方法:
somedict = collections.defaultdict(dict)
答案 1 :(得分:2)
Martijn(当然)使用调用基本dict
方法是正确的,你应该看defaultdict
。但是,您可以“作弊”并将__getitem__
定义为:
class Dict_(dict):
def __getitem__(self, key):
return self.setdefault(key, {})
答案 2 :(得分:0)
如果整个程序运行的默认值保持不变,您可以使用集合中的defaultdict
。
from collections import defaultdict
data = defaultdict(list)
如果应在运行时计算此值,则可以覆盖__getitem__
方法
class Dict_(dict):
def __getitem__(self, key):
evaluated_value = [key]
return self.setdefault(key, evaluated_value)