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

问题描述 投票:0回答:2

Python文档在https://docs.python.org/3/library/collections.abc.html列出了抽象基类的实现应具有的所有方法。但是,切片有时仅作为__getitem__的一部分来实现。

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

编辑:我还在文档中找到了https://docs.python.org/3/library/stdtypes.html#typesseq-common。它列出了“大多数序列类型支持”的方法。我将其视为“序列类型应实现切片”并使用它进行注释。

python slice abstract-base-class
2个回答
0
投票

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

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


0
投票

TL; DR没有这样的子类,因为Python仅定义切片的syntax,没有任何语义。


为了成为SequenceMapping的子类,一个类必须实现__getitem__。但是,ABC都没有要求__getitem__的任何特定实现。这完全取决于实现类来解释index参数。

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

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

__getitem__signature而言,向其传递单个intstrslice对象或包含任何类型组合的元组之间没有区别。

© www.soinside.com 2019 - 2024. All rights reserved.