Python 实现_ugetItem__

Python 实现_ugetItem__,python,Python,有没有一种方法可以实现\uuuu getitem\uuuu以支持整数和切片索引的方式,而无需手动检查参数的类型 我看到了很多这种形式的例子,但对我来说它似乎很粗糙 def __getitem__(self,key): if isinstance(key,int): # do integery foo here if isinstance(key,slice): # do slicey bar here 另一方面,为什么这个问题首先存在?有时返回int,有时返回slice

有没有一种方法可以实现
\uuuu getitem\uuuu
以支持整数和切片索引的方式,而无需手动检查参数的类型

我看到了很多这种形式的例子,但对我来说它似乎很粗糙

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

另一方面,为什么这个问题首先存在?有时返回int,有时返回slice是一种奇怪的设计。调用
foo[4]
应该调用
foo.\uu getitem\uuuuuuuu(slice(4,5,1))
或类似的方法。

您可以使用异常处理;假设
key
是一个
slice
对象,并对其调用
index()
方法。如果失败,则它必须是一个整数:

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
大多数自定义容器的用例不需要支持切片,而且历史上,
\uuuu getitem\uuuu
方法只需要处理整数(即序列);那家公司是来处理切片的。当
\uuuu getslice\uuuu
被弃用时,为了向后兼容和更简单的API,让
\uuuu getitem\uuuuu
处理整数和
slice
对象更容易


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

key
不必是整数,因此尝试将其强制到切片中会有点奇怪。啊哈,这是一种很好的python方法。与其测试对象的类型,不如测试它是否有特定的方法,即duck类型的本质。(虽然我认为我会使用getattr而不是捕获异常)显然,我有一个切片和索引的用例,否则我不会问这个问题。。。