3

私はdictサブクラスを持っています。その仕事はネストされたdictキーが存在しない場合は動的に追加し、appendが呼び出された場合はlistappendを実行することです。

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 = list()することで、名前selfを新しいリストに再割り当てするだけで、そのリストは破棄されます。

そして、私はあなたが何をしようとしているのか理解していません-getitemから、何かが足りない場合はその場で新しい辞書を作成しています...リストの動作をどのように混ぜ合わせますか?

于 2012-10-18T15:28:25.253 に答える
0

あなたの問題の1つは自分自身を再割り当てすることです、しかしそれはそうではありません。appendコマンドでselfの値を出力してみると、別の問題が発生する可能性があります。ループが無限再帰に入ります。これは、appendコマンドのpowerDictでappendコマンドを呼び出しているためです。

これにより、appendコマンドを書き直さなくても問題は解決するはずですが、上記の問題を回避するために、とにかく書き直しておくことを強くお勧めします。

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