如何重新加载__getitem__,以便在键不存在时可以创建它

时间:2013-11-08 14:10:00

标签: python python-2.7 dictionary

是否可以创建一个尚不存在的键值,重新加载方法__ 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__完成我想要的工作?

3 个答案:

答案 0 :(得分:5)

您需要拨打原始 __getitem__;使用self[key]调用顶级__getitem__并创建无限递归。

这样做:

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

请注意,内置的Python dict类型已经支持您的用例;如果您定义__missing__() method,它将自动调用:

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

这是collections.defaultdict() 所做的,提供调用提供的工厂方法的__missing__方法:

somedict = collections.defaultdict(dict)

答案 1 :(得分:2)

Martijn(当然)使用调用基本dict方法是正确的,你应该看defaultdict。但是,您可以“作弊”并将__getitem__定义为:

class Dict_(dict):
    def __getitem__(self, key):
        return self.setdefault(key, {})

答案 2 :(得分: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)