Spec-Zone.ru › Python 3.13

collections.abc — Абстрактные базовые классы для контейнеров

Добавлен в версии 3.3: Ранее этот модуль был частью модуля collections.

Исходный код: Lib/_collections_abc.py

Этот модуль предоставляет абстрактные базовые классы, которые могут использоваться для проверки, предоставляет ли класс определённый интерфейс; например, является ли он хешируемым или является ли он отображением.

Тест issubclass() или isinstance() для интерфейса работает одним из трёх способов.

1) Новый класс может быть унаследован непосредственно от одного из абстрактных базовых классов. Класс должен предоставить необходимые абстрактные методы. Остальные методы-микшины наследуются и могут быть переопределены, если это необходимо. Другие методы могут быть добавлены по мере необходимости:

class C(Sequence):                      # Direct inheritance
    def __init__(self): ...             # Extra method not required by the ABC
    def __getitem__(self, index):  ...  # Required abstract method
    def __len__(self):  ...             # Required abstract method
    def count(self, value): ...         # Optionally override a mixin method
>>> issubclass(C, Sequence)
True
>>> isinstance(C(), Sequence)
True

2) Существующие классы и встроенные классы могут быть зарегистрированы как «виртуальные подклассы» ABC. Эти классы должны определять весь API, включая все абстрактные методы и все методы-микшины. Это позволяет пользователям полагаться на тесты issubclass() или isinstance(), чтобы определить, поддерживается ли полный интерфейс. Исключением из этого правила являются методы, которые автоматически вычисляются из остальной части API:

class D:                                 # No inheritance
    def __init__(self): ...              # Extra method not required by the ABC
    def __getitem__(self, index):  ...   # Abstract method
    def __len__(self):  ...              # Abstract method
    def count(self, value): ...          # Mixin method
    def index(self, value): ...          # Mixin method

Sequence.register(D)                     # Register instead of inherit
>>> issubclass(D, Sequence)
True
>>> isinstance(D(), Sequence)
True

В этом примере классу D не нужно определять __contains__, __iter__, и __reversed__, потому что оператор in, логика итерации и функция reversed() автоматически обращаются к использованию __getitem__ и __len__.

3) Некоторые простые интерфейсы напрямую распознаются по наличию необходимых методов (если эти методы не установлены в None):

class E:
    def __iter__(self): ...
    def __next__(self): ...
>>> issubclass(E, Iterable)
True
>>> isinstance(E(), Iterable)
True

Сложные интерфейсы не поддерживают последний метод, так как интерфейс подразумевает не только наличие имён методов. Интерфейсы определяют семантику и отношения между методами, которые нельзя вывести только из наличия конкретных имён методов. Например, знание о том, что класс предоставляет __getitem__, __len__, и __iter__, недостаточно для отличия Sequence от Mapping.

Добавлен в версии 3.9: Эти абстрактные классы теперь поддерживают []. См. Тип обобщённого псевдонима и PEP 585.

Коллекции абстрактные базовые классы

Модуль collections предлагает следующие ABC:

END_OF_DOCUMENT_MARKER ```

ABC

Наследуется от

Абстрактные методы

Методы-микшины

Container [1]

__contains__

Hashable [1]

__hash__

Iterable [1] [2]

__iter__

Iterator [1]

Iterable

__next__

__iter__

Reversible [1]

Iterable

__reversed__

Generator [1]

Iterator

send, throw

close, __iter__, __next__

Sized [1]

__len__

Callable [1]

__call__

Collection [1]

Sized, Iterable, Container

__contains__, __iter__, __len__

Sequence

Reversible, Collection

__getitem__, __len__

__contains__, __iter__, __reversed__, index, and count

MutableSequence

Sequence

__getitem__, __setitem__, __delitem__, __len__, insert

Наследованные Sequence методы и append, clear, reverse, extend, pop, remove, and __iadd__

ByteString

Sequence

__getitem__, __len__

Наследованные Sequence методы

Set

Collection

__contains__, __iter__, __len__

__le__, __lt__, __eq__, __ne__, __gt__, __ge__, __and__, __or__, __sub__, __xor__, and isdisjoint

MutableSet

Set

__contains__, __iter__, __len__, add, discard

Наследованные Set методы и clear, pop, remove, __ior__, __iand__, __ixor__, and __isub__

Mapping

Collection

__getitem__, __iter__, __len__

__contains__, keys, items, values, get, __eq__, and __ne__

MutableMapping

Mapping

__getitem__, __setitem__, __delitem__, __iter__, __len__

Наследованные Mapping методы и pop, popitem, clear, update, and setdefault

MappingView

Sized

__len__

ItemsView

MappingView, Set

__contains__, __iter__

KeysView

MappingView, Set

__contains__, __iter__

ValuesView

MappingView, Collection

__contains__, __iter__

Awaitable [1]

__await__

END_OF_DOCUMENT_MARKER

Coroutine [1]

Awaitable

send, throw

close

AsyncIterable [1]

__aiter__

AsyncIterator [1]

AsyncIterable

__anext__

__aiter__

AsyncGenerator [1]

AsyncIterator

asend, athrow

aclose, __aiter__, __anext__

Buffer [1]

__buffer__

Сноски

[1] (1,2,3,4,5,6,7,8,9,10,11,12,13,14,15)

Эти ABCs переопределяют __subclasshook__(), чтобы поддерживать тестирование интерфейса путём проверки наличия необходимых методов и того, что они не установлены в None. Это работает только для простых интерфейсов. Более сложные интерфейсы требуют регистрации или прямого наследования.

[2]

Проверка isinstance(obj, Iterable) обнаруживает классы, зарегистрированные как Iterable или имеющие метод __iter__(), но не обнаруживает классы, которые итерируются с помощью метода __getitem__(). Единственный надёжный способ определить, является ли объект итерируемым, — вызвать iter(obj).

Классы абстрактного базиса коллекций – подробные описания

class collections.abc.Container

ABC для классов, предоставляющих метод __contains__().

class collections.abc.Hashable

ABC для классов, предоставляющих метод __hash__().

class collections.abc.Sized

ABC для классов, предоставляющих метод __len__().

class collections.abc.Callable

ABC для классов, предоставляющих метод __call__().

См. Аннотирование вызываемых объектов для подробностей о том, как использовать Callable в аннотациях типов.

class collections.abc.Iterable

ABC для классов, предоставляющих метод __iter__().

Проверка isinstance(obj, Iterable) обнаруживает классы, зарегистрированные как Iterable или имеющие метод __iter__(), но она не обнаруживает классы, которые итерируются с помощью метода __getitem__(). Единственный надёжный способ определить, является ли объект итерируемым, заключается в вызове iter(obj).

class collections.abc.Collection

ABC для классов контейнеров, имеющих размер и являющихся итерируемыми.

Добавлен в версии 3.6.

class collections.abc.Iterator

ABC для классов, предоставляющих методы __iter__() и __next__(). См. также определение итератора.

class collections.abc.Reversible

ABC для итерируемых классов, которые также предоставляют метод __reversed__().

Добавлен в версии 3.6.

class collections.abc.Generator

ABC для классов генераторов, которые реализуют протокол, определённый в PEP 342, который расширяет итераторы с помощью методов send(), throw() и close().

См. Аннотирование генераторов и сопроцедур для подробностей о использовании Generator в аннотациях типов.

Добавлен в версии 3.5.

class collections.abc.Sequence
class collections.abc.MutableSequence
class collections.abc.ByteString

ABC для неизменяемых и изменяемых последовательностей.

Примечание по реализации: некоторые методы миксинов, такие как __iter__(), __reversed__() и index(), вызывают метод __getitem__() многократно. Поэтому, если __getitem__() реализован со скоростью доступа, постоянной во времени, то методы миксинов будут иметь линейную производительность; однако, если базовый метод имеет линейную производительность (как в случае с связанным списком), то миксины будут иметь квадратичную производительность и, вероятно, потребуют переопределения.

Изменено в версии 3.5: Метод index() получил поддержку аргументов stop и start.

Устарело начиная с версии 3.12, будет удалено в версии 3.14: ABC ByteString устарел. Для использования в типизации предпочтительнее использовать объединение, например bytes | bytearray, или collections.abc.Buffer. Для использования в качестве ABC предпочтительнее Sequence или collections.abc.Buffer.

class collections.abc.Set
class collections.abc.MutableSet

ABC для неизменяемых и изменяемых множеств.

class collections.abc.Mapping
class collections.abc.MutableMapping

ABC для неизменяемых и изменяемых отображений.

class collections.abc.MappingView
class collections.abc.ItemsView
class collections.abc.KeysView
class collections.abc.ValuesView

ABC для отображений, элементов, ключей и значений представлений.

class collections.abc.Awaitable

ABC для объектов-ожидаемых, которые могут использоваться в выражениях await. Собственные реализации должны предоставлять метод __await__().

Объекты сопроцедуры и экземпляры ABC Coroutine являются экземплярами этого ABC.

Примечание

В CPython генераторные сопроцедуры (генераторы, декорированные @types.coroutine) являются ожидаемыми, даже если у них нет метода __await__(). Использование isinstance(gencoro, Awaitable) для них вернёт False. Для их обнаружения используйте inspect.isawaitable().

Добавлен в версии 3.5.

END_OF_DOCUMENT_MARKER
class collections.abc.Coroutine

ABC для совместимых с корутиной классов. Они реализуют следующие методы, определённые в Объектах корутины: send(), throw() и close(). Пользовательские реализации также должны реализовать __await__(). Все экземпляры Coroutine также являются экземплярами Awaitable.

Примечание

В CPython, корутины на основе генераторов (генераторы, декорированные @types.coroutine) являются awaitable, даже если у них нет метода __await__(). Использование isinstance(gencoro, Coroutine) для них вернёт False. Используйте inspect.isawaitable() для их обнаружения.

См. Аннотирование генераторов и корутин для подробностей об использовании Coroutine в аннотациях типов. Изменчивость и порядок параметров типа соответствуют таковым для Generator.

Добавлена в версии 3.5.

class collections.abc.AsyncIterable

ABC для классов, предоставляющих метод __aiter__. См. также определение асинхронного итерируемого объекта.

Добавлена в версии 3.5.

class collections.abc.AsyncIterator

ABC для классов, предоставляющих методы __aiter__ и __anext__. См. также определение асинхронного итератора.

Добавлена в версии 3.5.

class collections.abc.AsyncGenerator

ABC для классов асинхронных генераторов, которые реализуют протокол, определённый в PEP 525 и PEP 492.

См. Аннотирование генераторов и корутин для подробностей об использовании AsyncGenerator в аннотациях типов.

Добавлена в версии 3.6.

class collections.abc.Buffer

ABC для классов, предоставляющих метод __buffer__(), реализующий протокол буфера. См. PEP 688.

Добавлена в версии 3.12.

Примеры и рецепты

ABC позволяют нам спрашивать классы или экземпляры о наличии определённой функциональности, например:

size = None
if isinstance(myvar, collections.abc.Sized):
    size = len(myvar)

Некоторые ABC также полезны в качестве миксинов, что упрощает разработку классов, поддерживающих контейнерные API. Например, для написания класса, поддерживающего полный API Set, достаточно предоставить три основополагающих абстрактных метода: __contains__(), __iter__() и __len__(). ABC предоставляет остальные методы, такие как __and__() и isdisjoint():

class ListBasedSet(collections.abc.Set):
    ''' Alternate set implementation favoring space over speed
        and not requiring the set elements to be hashable. '''
    def __init__(self, iterable):
        self.elements = lst = []
        for value in iterable:
            if value not in lst:
                lst.append(value)

    def __iter__(self):
        return iter(self.elements)

    def __contains__(self, value):
        return value in self.elements

    def __len__(self):
        return len(self.elements)

s1 = ListBasedSet('abcdef')
s2 = ListBasedSet('defghi')
overlap = s1 & s2            # The __and__() method is supported automatically

Примечания по использованию Set и MutableSet в качестве миксина:

  1. Поскольку некоторые операции с множествами создают новые множества, стандартные методы миксина должны иметь возможность создавать новые экземпляры из итерируемого объекта. Предполагается, что конструктор класса имеет вид ClassName(iterable). Это предположение реализовано в виде внутреннего classmethod под названием _from_iterable(), который вызывает cls(iterable) для создания нового множества. Если миксин Set используется в классе с другим сигнатурой конструктора, вам потребуется переопределить _from_iterable() с помощью метода класса или обычного метода, который может создавать новые экземпляры из итерируемого аргумента.
  2. Для переопределения сравнений (вероятно, для повышения скорости, так как семантика фиксирована), переопределите __le__() и __ge__(), тогда остальные операции автоматически последуют.
  3. Миксин Set предоставляет метод _hash() для вычисления значения хеша множества; однако, __hash__() не определён, потому что не все множества являются хешируемыми или неизменяемыми. Для добавления хеширования множеств с помощью миксинов, наследуйте как от Set(), так и от Hashable(), затем определите __hash__ = Set._hash.

См. также

  • Рецепт OrderedSet для примера, построенного на основе MutableSet.
  • Для получения дополнительной информации об ABC, обратитесь к модулю abc и PEP 3119.

© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/collections.abc.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API