我有一个dict子类,其作用是动态添加嵌套的dict键(如果它不存在),如果调用append则执行list append:
class PowerDict(dict):
def __getitem__(self, item):
try:
return dict.__getitem__(self, item)
except KeyError:
value = self[item] = type(self)()
return value
def append(self,item):
if type(self) != list:
self = list()
self.append(item)
所以
a = PowerDict()
a['1']['2'] = 3
产生输出:
a = {'1': {'2': 3}}
然而,有时我需要做这样的事情:
b = PowerDict()
b['1']['2'].append(3)
b['1']['2'].append(4)
应该产生输出:
b = {'1': {'2': [3, 4]}}
但上面的代码产生输出:
{'1': {'2': {}}}
我缺少什么?
答案 0 :(得分:1)
class PowerDict(dict):
# http://stackoverflow.com/a/3405143/190597 (gnibbler)
def __init__(self, parent = None, key = None):
self.parent = parent
self.key = key
def __missing__(self, key):
self[key] = PowerDict(self, key)
return self[key]
def append(self, item):
self.parent[self.key] = [item]
def __setitem__(self, key, val):
dict.__setitem__(self, key, val)
try:
val.parent = self
val.key = key
except AttributeError:
pass
a = PowerDict()
a['1']['2'] = 3
print(a)
b = PowerDict()
b['1']['2'].append(3)
b['1']['2'].append(4)
print(b)
a['1']['2'] = b
a['1']['2'].append(5)
print(a['1']['2'])
产量
{'1': {'2': 3}}
{'1': {'2': [3, 4]}}
[5]
答案 1 :(得分:0)
你的append()方法永远不会有效。通过执行self = list()
,您只需将名称self
重新分配给新列表,然后将其丢弃。
而且我不明白你要做什么 - 从getitem开始,如果有什么东西丢失,你就会动态创建新的词典......你会如何混合列表行为呢?
答案 2 :(得分:0)
你的一个问题是重新分配自己,然而,不是这样。尝试在append命令中打印出self的值,你可以看到另一个问题:循环进入无限递归。这是因为你在append命令中的powerDict上调用了append命令!
这可以在不重写append命令的情况下解决您的问题,但我强烈建议您重新编写它以避免上述问题:
b['1']['2']= [3]
b['1']['2'].append(4)