Python中序列__getitem__的原型定义是什么?

时间:2015-09-08 04:34:21

标签: python python-3.x python-3.4

现在,我正在这样做:

class EdgesGenerator(abc.Sequence):

    def __init__(self, link, size):
        self.link = link
        self.size = size

    def __getitem__(self, cluster_index):
        try:
            index = cluster_index.__index__()
        except AttributeError:
            raise TypeError from None
        if 0 <= index < self.size:
            return Edge(self.link, index)
        raise IndexError

    def __len__(self):
        return self.size

这是序列的典型__getitem__ 吗?怎么写呢?

1 个答案:

答案 0 :(得分:1)

正如@Cristian在评论中正确给出的那样,我所知道的唯一标准模式来自documentation -

  

object .__ getitem __(self,key)

     

被要求实施self[key]的评估。对于序列类型,接受的键应该是整数和切片对象。请注意,负索引的特殊解释(如果类希望模拟序列类型)取决于__getitem__()方法。如果key是不合适的类型,则可能引发TypeError;如果序列的索引集之外的值(在对负值进行任何特殊解释之后),则应引发IndexError。对于映射类型,如果缺少键(不在容器中),则应引发KeyError。

但是我的实施中还有另一个问题,对于__getitem__()的每次有效调用,都是object[index]之类的问题。您每次都在创建一个新的Edge对象。

因此,每当您调用object[index]时,您将收到一个新的Edge对象(尽管该边缘对象的内容可能相同),但该对象本身将是新的。

因此 - object[index] is object[index]之类的东西很可能会失败(会导致False)。

除非您打算这样做,否则您应该尝试缓存Edge对象(如果找到则从缓存返回)。我建议使用字典来缓存对象(因为你似乎只是在访问时动态创建对象),虽然你也可以使用列表,你只需要将列表初始化为{{1 }。