Python文档在https://docs.python.org/3/library/collections.abc.html列出了抽象基类的实现应具有的所有方法。但是,切片有时仅作为__getitem__
的一部分来实现。
我想所有从Sequence
继承的类都将实现它,是这样吗?还有其他方法可以知道对象支持切片吗?
编辑:我还在文档中找到了https://docs.python.org/3/library/stdtypes.html#typesseq-common。它列出了“大多数序列类型支持”的方法。我将其视为“序列类型应实现切片”并使用它进行注释。
在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没有这样的子类,因为Python仅定义切片的syntax,没有任何语义。
为了成为Sequence
或Mapping
的子类,一个类必须实现__getitem__
。但是,ABC都没有要求__getitem__
的任何特定实现。这完全取决于实现类来解释index参数。
切片并不是真正的特殊操作;它只是用于指定类型为slice
的参数的特殊语法。以下是等效的:
foo[1:3,2::9]
foo[slice(1,3), slice(2,None,9)]
就__getitem__
的signature而言,向其传递单个int
,str
,slice
对象或包含任何类型组合的元组之间没有区别。