__getitem__表示列表与词典

时间:2014-04-25 15:58:30

标签: python list dictionary magic-methods

词典 __getitem__方法似乎与列表的工作方式不同,这让我头疼。这就是我的意思:

如果我继承列表,我可以将__getitem__重载为:

class myList(list):
    def __getitem__(self,index):
        if isinstance(index,int):
            #do one thing
        if isinstance(index,slice):
            #do another thing

如果我继承 dict __getitem__不公开索引,而是公开,如下所示:

class myDict(dict):
    def __getitem__(self,key):
        #Here I want to inspect the INDEX, but only have access to key!

所以,我的问题是如何拦截dict的索引,而不仅仅是

示例用例:

a = myDict()
a['scalar'] = 1  # Create dictionary entry called 'scalar', and assign 1
a['vector_1'] = [1,2,3,4,5]  # I want all subsequent vectors to be 5 long
a['vector_2'][[0,1,2]] = [1,2,3]  # I want to intercept this and force vector_2 to be 5 long
print(a['vector_2'])
[1,2,3,0,0]
a['test']  # This should throw a KeyError
a['test'][[0,2,3]]  # So should this

1 个答案:

答案 0 :(得分:2)

字典没有顺序;没有索引传入;这就是为什么Python可以对列表和词典使用相同的语法([..])和相同的魔术方法(__getitem__)。

当您在类似0的整数上对字典编索索引时,字典会像对待任何其他键一样处理该字典:

>>> d = {'foo': 'bar', 0: 42}
>>> d.keys()
[0, 'foo']
>>> d[0]
42
>>> d['foo']
'bar'

链式索引适用于返回值;表达式:

a['vector_2'][0, 1, 2]

执行为:

_result = a['vector_2']  # via a.__getitem__('vector_2')
_result[0, 1, 2]         # via _result.__getitem__((0, 1, 2))

因此,如果您希望字典中的 values 以某种方式运行,则必须返回支持这些操作的对象。