3

我有一个 dict 子类,它的工作是在嵌套 dict 键不存在时动态添加它,如果调用 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': {}}}

我错过了什么?

4

3 回答 3

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]
于 2012-10-18T15:46:12.020 回答
0

您的问题之一是重新分配自我,但事实并非如此。尝试在 append 命令中打印出 self 的值,可以看到另一个问题:循环进入无限递归。这是因为您在 append 命令中调用 powerDict 上的 append 命令!

这应该可以在不重写 append 命令的情况下解决您的问题,但我强烈建议您无论如何都要重写它以避免上述问题:

b['1']['2']= [3]
b['1']['2'].append(4)
于 2012-10-18T15:34:29.103 回答
0

您的 append() 方法永远不会起作用。通过这样做self = list(),您只是将名称重新分配self给一个新列表,然后将其丢弃。

而且我不明白您要做什么-从getitem开始,如果缺少某些东西,您正在即时创建新词典……您将如何混合列表行为?

于 2012-10-18T15:28:25.253 回答