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 回答