实现__getitem__

时间:2014-03-03 15:58:37

标签: python

有没有办法以支持整数和切片索引的方式实现__getitem__而无需手动检查参数的类型?

我看到很多这种形式的例子,但对我来说似乎非常黑客。

def __getitem__(self,key):
  if isinstance(key,int):
    # do integery foo here
  if isinstance(key,slice):
    # do slicey bar here

在相关的说明中,为什么这个问题首先存在? Somtimes返回一个int,有时一个切片是奇怪的设计。致电foo[4]应致电foo.__getitem__(slice(4,5,1))或类似。

1 个答案:

答案 0 :(得分:5)

您可以使用异常处理;假设keyslice对象,并在其上调用indices()方法。如果失败则必须是整数:

def __getitem__(self, key):
    try:
        return [self.somelist[i] * 5 for i in key.indices(self.length)]
    except AttributeError:
        # not a slice object (no `indices` attribute)
        return self.somelist[key] * 5

自定义容器的大多数用例不需要支持切片,而且从历史上看,__getitem__方法只需要处理整数(对于序列,即);而__getslice__() method则用于处理切片。不推荐使用__getslice__时,为了向后兼容,对于更简单的API,__getitem__处理整数和slice对象会更容易。

这忽略了外部序列key不必是整数的事实。自定义类可以自由支持他们喜欢的任何键类型。