首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >哪些内置抽象基类支持切片?

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

Stack Overflow用户
提问于 2020-05-28 09:39:05
回答 2查看 152关注 0票数 1

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

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

编辑:我还在文档中找到了https://docs.python.org/3/library/stdtypes.html#typesseq-common。它列出了“大多数序列类型所支持的”方法。

我将把它理解为“序列类型应该实现切片”,并使用它进行注释。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-05-28 11:22:11

typeshed/typing.pyi中,顺序按以下方式键入:

代码语言:javascript
复制
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

因此,任何序列类型都应该支持切片。没有为键入模块中的其他类型指定片。例如,映射显式地列出了映射的关键类型。

票数 1
EN

Stack Overflow用户

发布于 2020-05-28 11:23:48

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

为了成为SequenceMapping的子类,类必须实现__getitem__。但是,这两种方法都不要求__getitem__的任何特定实现;这完全取决于实现类如何解释索引参数。

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

代码语言:javascript
复制
foo[1:3,2::9]
foo[slice(1,3), slice(2,None,9)]

__getitem__的签名而言,传递一个int、一个str、一个slice对象或包含任何类型组合的元组之间没有区别。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62061525

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档