【问题标题】:How can reload __getitem__ so that, when key doesn't exist, can create it如何重新加载 __getitem__ 以便在密钥不存在时创建它
【发布时间】:2013-11-20 13:53:50
【问题描述】:

是否可以创建一个还不存在的键值,重新加载方法__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__做我想做的事?

【问题讨论】:

    标签: python python-2.7 dictionary


    【解决方案1】:

    您需要拨打原文__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)
    

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

        如果整个程序运行的默认值保持不变,您可以使用集合中的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)
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2017-07-03
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-02-24
          相关资源
          最近更新 更多