0

メソッド __ 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__

4

3 に答える 3

5

オリジナル を呼び出す必要があり__getitem__ます。usingself[key]はトップレベルを呼び出し、__getitem__無限再帰を作成します。

これを行う:

class Dict_(dict):
  def __getitem__(self, key):
     if key not in self:
         self[key] = {}
     return super(Dict_, self).__getitem__(key)

組み込みの Pythondict型は、ユースケースを既にサポートしていることに注意してください。__missing__()メソッドを定義すると、自動的に呼び出されます。

class Dict_(dict):
  def __missing__(self, key):
     self[key] = {}
     return self[key]

これは提供されたファクトリメソッドを呼び出すメソッドを提供することです:collections.defaultdict() __missing__

somedict = collections.defaultdict(dict)
于 2013-11-08T14:14:49.217 に答える
2

Martijn の (もちろん) base dicts メソッドの呼び出しの使い方は正しいので、 を参照する必要がありますdefaultdict。ただし、「チート」して次のように定義することもできます__getitem__

class Dict_(dict):
    def __getitem__(self, key):
        return self.setdefault(key, {})
于 2013-11-08T14:25:09.223 に答える
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)
于 2013-11-08T14:31:07.350 に答える