哪个内置抽象库类支持切片?
Which built-in abstract base classes support slicing?
Python 的文档在 https://docs.python.org/3/library/collections.abc.html 中非常清楚地列出了抽象基 类 的实现应该具有的所有方法。
然而,切片有时仅作为 __getitem__
的一部分实现。
我想所有从 Sequence
继承的 类 都会实现它,是这样吗?有没有其他方法可以知道一个对象支持切片?
编辑:我还在文档中找到了 https://docs.python.org/3/library/stdtypes.html#typesseq-common。它将方法列为 'supported by most sequence types'.
我将其作为 'Sequence types should implement slicing' 并使用它进行注释。
在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 没有这样的子class,因为Python只定义了切片的语法,没有定义任何语义。
为了成为 Sequence
或 Mapping
的子class,class 必须实现 __getitem__
。但是,ABC 均未强制执行 __getitem__
;这完全取决于实施 class 如何解释索引参数。
切片并不是真正的特殊操作;它只是用于指定类型 slice
的参数的特殊语法。以下是等价的:
foo[1:3,2::9]
foo[slice(1,3), slice(2,None,9)]
就__getitem__
的签名而言,传递一个int
和一个str
没有区别、slice
对象或包含任意类型组合的元组。
Python 的文档在 https://docs.python.org/3/library/collections.abc.html 中非常清楚地列出了抽象基 类 的实现应该具有的所有方法。
然而,切片有时仅作为 __getitem__
的一部分实现。
我想所有从 Sequence
继承的 类 都会实现它,是这样吗?有没有其他方法可以知道一个对象支持切片?
编辑:我还在文档中找到了 https://docs.python.org/3/library/stdtypes.html#typesseq-common。它将方法列为 'supported by most sequence types'.
我将其作为 'Sequence types should implement slicing' 并使用它进行注释。
在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 没有这样的子class,因为Python只定义了切片的语法,没有定义任何语义。
为了成为 Sequence
或 Mapping
的子class,class 必须实现 __getitem__
。但是,ABC 均未强制执行 __getitem__
;这完全取决于实施 class 如何解释索引参数。
切片并不是真正的特殊操作;它只是用于指定类型 slice
的参数的特殊语法。以下是等价的:
foo[1:3,2::9]
foo[slice(1,3), slice(2,None,9)]
就__getitem__
的签名而言,传递一个int
和一个str
没有区别、slice
对象或包含任意类型组合的元组。