По соглашению протоколы представляют собой группы специальных методов, описывающих общее поведение. Вы можете вывести протоколы из абстрактных методов модуля collections.abc
. (Питон 3.3+); см. также документы . Автоматизируйте этот список с помощью следующего:
Дано
import abc
import collections as ct
Код
def get_protocols(source=ct.abc):
"""Return a dict of protocols from `collections.abc`."""
d = {}
for objname in dir(source):
if objname.startswith("_"):
continue
obj = getattr(source, objname)
abmethods = sorted(obj.__abstractmethods__)
if not abmethods:
continue
d[objname] = abmethods
return d
Демо
get_protocols()
Выход
{
'AsyncGenerator': ['asend', 'athrow'],
'AsyncIterable': ['__aiter__'],
'AsyncIterator': ['__anext__'],
'Awaitable': ['__await__'],
'ByteString': ['__getitem__', '__len__'],
'Callable': ['__call__'],
'Collection': ['__contains__', '__iter__', '__len__'],
'Container': ['__contains__'],
'Coroutine': ['__await__', 'send', 'throw'],
'Generator': ['send', 'throw'],
'Hashable': ['__hash__'],
'Iterable': ['__iter__'],
'Iterator': ['__next__'],
'Mapping': ['__getitem__', '__iter__', '__len__'],
'MutableMapping': ['__delitem__', '__getitem__', '__iter__', '__len__', '__setitem__'],
'MutableSequence': ['__delitem__', '__getitem__', '__len__', '__setitem__', 'insert'],
'MutableSet': ['__contains__', '__iter__', '__len__', 'add', 'discard'],
'Reversible': ['__iter__', '__reversed__'],
'Sequence': ['__getitem__', '__len__'],
'Set': ['__contains__', '__iter__', '__len__'],
'Sized': ['__len__']
}
ПРИМЕЧАНИЕ. При создании подклассов это (обязательные) абстрактные методы, которые не включают методы примесей. Пример: подкласс collections.abc.Mappings
предоставит методы .keys()
, .values()
, .items()
(нет в списке) после реализации протокола.
person
pylang
schedule
22.02.2020