Python通过索引获取字典值

-2 投票
4 回答
3837 浏览
提问于 2025-04-17 00:25

我有一个子类,它是从字典(dict)继承来的。在这个类里,我想在__getitem__这个方法中检查一下键(key)是不是数字。如果是数字,我想实现一些其他的功能;如果不是数字,那就按正常的方式继续处理。举个例子:

class M(dict):
   ...
   def __getitem__(self, key):
      if self.isNumber(key):
          print "I am number"
      else:
          # continue the same way as it would have done
   ...

>>> x = M({"name": "Tom", "surname": "Baker", "age": "55"})
>>> print x["name"]
Tom
>>> x[0]
I am number

我该怎么做呢?

更新

我知道字典里的项目是经过哈希处理的,所以它们的顺序是不固定的。我问这个问题的原因是别的。而且我知道你们可能还会问为什么,所以我来解释一下:这个字典是一个对象,我会通过索引来获取与给定对象相关的其他对象。(可以想象成父子关系的东西)

4 个回答

1

为了实现这个功能,当键不是数字时,你需要调用父类的 __getitem__ 方法。这个操作可以通过 super() 函数来完成。下面是一个例子:

class cls(dict):
     def __getitem__(self, key):
         if isinstance(numbers.Number):
             print "I am a number"
         else:
             return super(cls, self).__getitem__(key)
2
# continue the same way as it would have done

这里使用了 super() 这个函数。(这不是开玩笑)
http://docs.python.org/library/functions.html#super

2

我不确定这是不是你想要的...

class M(dict):

    def __getitem__(self, key):
        try:
            temp = int(key)
            return "I am a number"
        except ValueError:
            return self.get(key, None)

item = M({'one':'1', 'two':'2', '3':'three'})

print item['one']
print item[3]
print item[0]

正如@bpgergo提到的,你也可以使用super

所以返回的结果看起来会是这样的:

    except ValueError:
        return super(M, self).__getitem__(key)

这里最大的区别是,我的方法可能会不太好地抑制任何因为你尝试访问一个不存在的键而引发的KeyError错误。

撰写回答