Какие встроенные абстрактные базовые классы поддерживают нарезку? - PullRequest
0 голосов
/ 28 мая 2020

В документации Python перечислены все методы, которые реализации абстрактных базовых классов должны иметь очень четко по адресу https://docs.python.org/3/library/collections.abc.html. Однако нарезка иногда реализуется как часть __getitem__.

Я мог бы представить, что все классы, унаследованные от Sequence, будут его реализовывать, так ли это? Есть ли другие способы узнать, что объект поддерживает нарезку?

Изменить: я также нашел https://docs.python.org/3/library/stdtypes.html#typesseq -common в документации. В нем перечислены методы как «поддерживаемые большинством типов последовательностей».
Я возьму это как «Типы последовательностей должны реализовывать нарезку» и аннотировать их с помощью этого.

Ответы [ 2 ]

1 голос
/ 28 мая 2020

TL; DR Такого подкласса нет, потому что Python определяет только синтаксис нарезки, а не какую-либо семантику.


Чтобы быть подклассом Sequence или Mapping, класс должен реализовывать __getitem__. Однако ни один из AB C не требует какой-либо конкретной реализации __getitem__; как интерпретировать аргумент индекса целиком зависит от реализующего класса.

На самом деле нарезка не является специальной операцией; это просто специальный синтаксис для указания аргумента типа slice. Следующие значения эквивалентны:

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

Что касается подписи из __getitem__, нет никакой разницы между передачей ей одного int, str, объект slice или кортеж, содержащий любую комбинацию типов.

0 голосов
/ 28 мая 2020

В 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

Следовательно, любой тип последовательности должен поддерживать нарезку. Для других типов в модуле набора срезы не указываются. Например, отображение явно перечисляет ключевой тип отображения.

...