Python的文档列出了抽象基类的实现在https://docs.python.org/3/library/collections.abc.html上应该具有的所有方法。然而,切片有时只是作为__getitem__的一部分实现的。
我可以想象从Sequence继承的所有类都会实现它,是这样吗?还有其他方法可以知道对象支持切片吗?
编辑:我还在文档中找到了https://docs.python.org/3/library/stdtypes.html#typesseq-common。它列出了“大多数序列类型所支持的”方法。
我将把它理解为“序列类型应该实现切片”,并使用它进行注释。
发布于 2020-05-28 11:22:11
在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
因此,任何序列类型都应该支持切片。没有为键入模块中的其他类型指定片。例如,映射显式地列出了映射的关键类型。
发布于 2020-05-28 11:23:48
TL;DR没有这样的子类,因为Python只定义切片的语法,而不是任何语义。
为了成为Sequence或Mapping的子类,类必须实现__getitem__。但是,这两种方法都不要求__getitem__的任何特定实现;这完全取决于实现类如何解释索引参数。
切片并不是真正的特殊操作;它只是用于指定slice类型的参数的特殊语法。以下内容相当于:
foo[1:3,2::9]
foo[slice(1,3), slice(2,None,9)]就__getitem__的签名而言,传递一个int、一个str、一个slice对象或包含任何类型组合的元组之间没有区别。
https://stackoverflow.com/questions/62061525
复制相似问题