有没有办法以支持整数和切片索引的方式实现__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))
或类似。
答案 0 :(得分:5)
您可以使用异常处理;假设key
是slice
对象,并在其上调用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
不必是整数的事实。自定义类可以自由支持他们喜欢的任何键类型。