Python 哪些内置抽象基类支持切片?
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],
\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
的子类可以保证支持切片。