我应该用什么代替 .__getslice__?

What should I use instead of .__getslice__?

我正在将库移植到 Python 3. 我找到了这个方法:

def __getslice__(self, index, listget=list.__getslice__):
    self._resolve()
    return listget(self, index)

这会引发错误,因为 .__getslice__ 已弃用。我查看了文档,似乎 .__getitem__ 是大多数人用来替换 .__getslice__ 的东西。唯一的问题是这个库有一个与上述方法完全相同的方法,除了它被称为 __getitem__listget=list.__getitem__)。我不知道他们为什么在代码中做出这种区分,但似乎库的原始设计者想要保留这两种方法的独特功能。在移植到 Python 3 时,我有什么办法可以保持这一点吗?

您应该能够简单地一起删除 __getslice__ 方法。现在(在 python3.x 中)__getitem__ 除了 __getitem__ 处理过的案例之外,还处理 __getslice__ 曾经处理过的相同案例——因此,在 python3 中,自定义 class 上的 __getslice__ 方法(从外观上看可能是一个列表 subclass)不应该被调用。

另请注意,如果这是一个列表子class,那么您应该使用super调用超级class:

def __getitem__(self, index):
    self._resolve()
    return super().__getitem__(index)