哪个内置抽象库类支持切片?

Which built-in abstract base classes support slicing?

Python 的文档在 https://docs.python.org/3/library/collections.abc.html 中非常清楚地列出了抽象基 类 的实现应该具有的所有方法。 然而,切片有时仅作为 __getitem__ 的一部分实现。

我想所有从 Sequence 继承的 类 都会实现它,是这样吗?有没有其他方法可以知道一个对象支持切片?

编辑:我还在文档中找到了 https://docs.python.org/3/library/stdtypes.html#typesseq-common。它将方法列为 'supported by most sequence types'.
我将其作为 'Sequence types should implement slicing' 并使用它进行注释。

typeshed/typing.pyi中输入序列如下:

class Sequence(_Collection[_T_co], Reversible[_T_co], Generic[_T_co]):
    @overload
    @abstractmethod
    def __getitem__(self, i: int) -> _T_co: ...
    @overload
    @abstractmethod
    def __getitem__(self, s: slice) -> Sequence[_T_co]: ...
    ...

https://github.com/python/typeshed/blob/master/stdlib/3/typing.pyi#L274

因此任何序列类型都应该支持切片。类型模块中的其他类型不指示切片。例如,映射明确列出了映射的键类型。

TL;DR 没有这样的子class,因为Python只定义了切片的语法,没有定义任何语义。


为了成为 SequenceMapping 的子class,class 必须实现 __getitem__。但是,ABC 均未强制执行 __getitem__;这完全取决于实施 class 如何解释索引参数。

切片并不是真正的特殊操作;它只是用于指定类型 slice 的参数的特殊语法。以下是等价的:

foo[1:3,2::9]
foo[slice(1,3), slice(2,None,9)]

__getitem__签名而言,传递一个int和一个str没有区别、slice 对象或包含任意类型组合的元组。