Python 哪些内置抽象基类支持切片?

Python 哪些内置抽象基类支持切片?,python,slice,abstract-base-class,Python,Slice,Abstract Base Class,Python的文档列出了抽象基类的实现应该具有的所有方法。 但是,切片有时只是作为\uu getitem\uu的一部分实现的 我想所有继承自序列的类都会实现它,是这样吗?有没有其他方法可以知道对象支持切片 编辑:我还在文档中找到了。它将这些方法列为“大多数序列类型支持的方法”。 我将其视为“序列类型应实现切片”,并使用它进行注释。在typeshed/typing.pyi中,序列的类型如下: class Sequence(_Collection[_T_co], Reversible[_T_co],

Python的文档列出了抽象基类的实现应该具有的所有方法。 但是,切片有时只是作为
\uu getitem\uu
的一部分实现的

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

编辑:我还在文档中找到了。它将这些方法列为“大多数序列类型支持的方法”。

我将其视为“序列类型应实现切片”,并使用它进行注释。

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]: ...
    ...


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

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


为了成为
序列
映射
的子类,类必须实现
\uuu getitem\uuu
。但是,ABC都没有强制要求任何特定的
\uuuu getitem\uuuuu
;如何解释索引参数完全取决于实现类

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

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

\uuu getitem\uuu
的签名而言,将单个
int
str
slice
对象或包含任何类型组合的元组传递给它没有区别。

pythonic方法是尝试这样做,并查看是否引发异常。曾经有一个
\uuuu getslice\uuuu
方法,但在很久以前,它被一个
slice
对象传递给
\uu getitem\uu
所取代。实际上没有一类类型专门实现切片,正如没有一类类型可以用
int
值索引,也没有另一类类型可以用
str
值索引一样。似乎隐含的是,
序列
是一种其顺序由其索引顺序决定的类型,而
映射
的顺序(如果有定义)是不正确的。根据类型提示进行假设时要小心。例如,
Mapping
的键类型和值类型都是完全通用的,但是
dict
不允许非散列键。这意味着
序列
可以支持
切片
对象作为参数,但除了返回类型是另一个具有相同元素类型的序列之外,没有任何关于如何使用
切片
的内容。(例如,类型提示允许每个切片操作返回一个空元组,不管具体的序列类型如何。)有趣的是,dict的键类型也是完全通用的。Hashable似乎是一个他们还没有弄明白的特例。鉴于官方(键入)实现表明序列支持切片,我将使用它。在Python中,您可以在不实现抽象方法的情况下(正确地)将某个对象表示为子类,但对于任何子类,我们都可以这样说。我宁愿把这些案例看作是错误,而不喜欢使用类型提示。我同意实现切片的类应该是“代码>序列< /代码>的子类;我只是不同意,作为
Sequence
的子类可以保证支持切片。