Python много делает с магическими методами, и большинство из них являются частью какого-то протокола. Я знаком с протоколом итератора и числовым протоколом, но недавно наткнулся на термин протокол последовательности. Но даже после некоторых исследований я не совсем уверен, что такое протокол последовательности.
Например, функция C API PySequence_Check
проверяет (согласно документации), если какой-то объект реализует протокол последовательности. исходный код указывает, что это класс, не dict, но реализует метод __getitem__
, который примерно идентичен документации на iter
также указывает:
[...] должен поддерживать протокол последовательности (метод
__getitem__()
с целочисленными аргументами, начинающимися с 0).[...]
Но требование начинать с 0
не реализовано в PySequence_Check
.
Также есть тип collections.abc.Sequence
, что в основном говорит о том, что экземпляр должен реализовать __reversed__
, __contains__
, __iter__
и __len__
.
Но по этому определению класс, реализующий протокол последовательности, не обязательно является последовательностью, например, модель данных и абстрактный класс гарантируют, что последовательность имеет длину. Но класс, просто реализующий __getitem__
(передавая PySequence_Check
), выдает исключение при использовании len(an_instance_of_that_class)
.
Может ли кто-нибудь объяснить мне разницу между последовательностью и протоколом последовательности (если есть определение протокола помимо чтения исходного кода) и когда какое определение использовать?
collections.abc.Sequence
требует__getitem__
и__len__
. Для всего остального есть методы миксина. Что касается итерации, если только__getitem__
определен без__iter__
, то встроенныйiter
создает простой итератор, который начинается с индекса 0. Чтобыreversed
работал,__len__
также должен быть определен, чтобы он мог начинаться с последнего индекса. - person Eryk Sun   schedule 23.04.2017__len__
для реализации протокола последовательности (что касаетсяPySequence_Check
). И класс, реализующий__len__
и__getitem__
, но не наследующий отcollections.abc.Sequence
, не передаетisinstance(an_instance, Sequence)
. Именно это и вызвало мой вопрос. :) - person MSeifert   schedule 23.04.2017PySequence_Check
: grokbase.com/t/python/python-list/054erpfcep/ - person Ashwini Chaudhary   schedule 05.07.2018