1

Python 的文档在https://docs.python.org/3/library/collections.abc.html中非常清楚地列出了抽象基类的实现应该具有的所有方法。然而,切片有时仅作为__getitem__.

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

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

4

2 回答 2

1

typeshed/typing.pyi中,Sequence 的类型如下:

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-28T11:22:11.007 回答
1

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


为了成为Sequenceor的子类Mapping,一个类必须实现__getitem__。但是,ABC 都没有要求对__getitem__; 如何解释 index 参数完全取决于实现类。

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

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

就of的签名而言,将单个、 a 、对象或包含任何类型组合的元组__getitem__传递给它没有区别。intstrslice

于 2020-05-28T11:23:48.397 回答