Документация Python неофициальный перевод

collections.abc.md

205 строк · 23.1 КБ · обычная страница · сырой текст · скачать

1> **Источник:** https://python-all.ru/3.6/library/collections.abc.html2>3> «Документация Python на русском» – неофициальный перевод официальной документации Python: версии от 2.6 до 3.16, полнотекстовый поиск, английский оригинал рядом с переводом. Эта Markdown-версия страницы предназначена для работы с LLM: вставьте её в ChatGPT, Claude или Cursor.45---67# 8.4. [`collections.abc`](https://python-all.ru/3.6/library/collections.abc.html#module-collections.abc) – Абстрактные базовые классы для контейнеров89Новинка версии 3.3: Ранее этот модуль был частью модуля [`collections`](https://python-all.ru/3.6/library/collections.html#module-collections).1011**Исходный код:** [Lib/\_collections\_abc.py](https://python-all.ru/src/3.6/Lib/_collections_abc.py)1213---1415Этот модуль предоставляет [абстрактные базовые классы](https://python-all.ru/3.6/glossary.html#term-abstract-base-class), которые можно использовать для проверки, реализует ли класс определённый интерфейс; например, является ли он хешируемым или отображением.1617## 8.4.1. Абстрактные базовые классы коллекций1819Модуль collections предоставляет следующие [абстрактные базовые классы](https://python-all.ru/3.6/glossary.html#term-abstract-base-class):2021| ABC | Наследует от | Абстрактные методы | Методы-примеси |22| --- | --- | --- | --- |23| [`Container`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Container) |  | `__contains__` |  |24| [`Hashable`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Hashable) |  | `__hash__` |  |25| [`Iterable`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Iterable) |  | `__iter__` |  |26| [`Iterator`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Iterator) | [`Iterable`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Iterable) | `__next__` | `__iter__` |27| [`Reversible`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Reversible) | [`Iterable`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Iterable) | `__reversed__` |  |28| [`Generator`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Generator) | [`Iterator`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Iterator) | `send`, `throw` | `close`, `__iter__`, `__next__` |29| [`Sized`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Sized) |  | `__len__` |  |30| [`Callable`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Callable) |  | `__call__` |  |31| [`Collection`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Collection) | [`Sized`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Sized), [`Iterable`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Iterable), [`Container`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Container) | `__contains__`, `__iter__`, `__len__` |  |32| [`Sequence`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Sequence) | [`Reversible`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Reversible), [`Collection`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Collection) | `__getitem__`, `__len__` | `__contains__`, `__iter__`, `__reversed__`, `index` и `count` |33| [`MutableSequence`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.MutableSequence) | [`Sequence`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Sequence) | `__getitem__`, `__setitem__`, `__delitem__`, `__len__`, `insert` | Наследуемые методы [`Sequence`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Sequence) и `append`, `reverse`, `extend`, `pop`, `remove` и `__iadd__` |34| [`ByteString`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.ByteString) | [`Sequence`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Sequence) | `__getitem__`, `__len__` | Унаследованные методы [`Sequence`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Sequence) |35| [`Set`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Set) | [`Collection`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Collection) | `__contains__`, `__iter__`, `__len__` | `__le__`, `__lt__`, `__eq__`, `__ne__`, `__gt__`, `__ge__`, `__and__`, `__or__`, `__sub__`, `__xor__` и `isdisjoint` |36| [`MutableSet`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.MutableSet) | [`Set`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Set) | `__contains__`, `__iter__`, `__len__`, `add`, `discard` | Унаследованные методы [`Set`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Set) и `clear`, `pop`, `remove`, `__ior__`, `__iand__`, `__ixor__` и `__isub__` |37| [`Mapping`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Mapping) | [`Collection`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Collection) | `__getitem__`, `__iter__`, `__len__` | `__contains__`, `keys`, `items`, `values`, `get`, `__eq__` и `__ne__` |38| [`MutableMapping`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.MutableMapping) | [`Mapping`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Mapping) | `__getitem__`, `__setitem__`, `__delitem__`, `__iter__`, `__len__` | Унаследованные методы [`Mapping`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Mapping) и `pop`, `popitem`, `clear`, `update`, и `setdefault` |39| [`MappingView`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.MappingView) | [`Sized`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Sized) |  | `__len__` |40| [`ItemsView`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.ItemsView) | [`MappingView`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.MappingView), [`Set`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Set) |  | `__contains__`, `__iter__` |41| [`KeysView`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.KeysView) | [`MappingView`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.MappingView), [`Set`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Set) |  | `__contains__`, `__iter__` |42| [`ValuesView`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.ValuesView) | [`MappingView`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.MappingView) |  | `__contains__`, `__iter__` |43| [`Awaitable`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Awaitable) |  | `__await__` |  |44| [`Coroutine`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Coroutine) | [`Awaitable`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Awaitable) | `send`, `throw` | `close` |45| [`AsyncIterable`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.AsyncIterable) |  | `__aiter__` |  |46| [`AsyncIterator`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.AsyncIterator) | [`AsyncIterable`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.AsyncIterable) | `__anext__` | `__aiter__` |47| [`AsyncGenerator`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.AsyncGenerator) | [`AsyncIterator`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.AsyncIterator) | `asend`, `athrow` | `aclose`, `__aiter__`, `__anext__` |4849#### `class collections.abc.Container`5051#### `class collections.abc.Hashable`5253#### `class collections.abc.Sized`5455#### `class collections.abc.Callable`5657ABC для классов, которые предоставляют соответственно методы [`__contains__()`](https://python-all.ru/3.6/reference/datamodel.html#object.__contains__), [`__hash__()`](https://python-all.ru/3.6/reference/datamodel.html#object.__hash__), [`__len__()`](https://python-all.ru/3.6/reference/datamodel.html#object.__len__) и [`__call__()`](https://python-all.ru/3.6/reference/datamodel.html#object.__call__).5859#### `class collections.abc.Iterable`6061ABC для классов, которые предоставляют метод [`__iter__()`](https://python-all.ru/3.6/reference/datamodel.html#object.__iter__).6263Проверка `isinstance(obj, Iterable)` обнаруживает классы, которые зарегистрированы как [`Iterable`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Iterable) или имеют метод [`__iter__()`](https://python-all.ru/3.6/reference/datamodel.html#object.__iter__), но она не обнаруживает классы, которые итерируются с помощью метода [`__getitem__()`](https://python-all.ru/3.6/reference/datamodel.html#object.__getitem__). Единственный надёжный способ определить, является ли объект [итерируемым](https://python-all.ru/3.6/glossary.html#term-iterable), – вызвать `iter(obj)`.6465#### `class collections.abc.Collection`6667ABC для классов-контейнеров, которые поддерживают итерирование и определение размера.6869Новое в версии 3.6.7071#### `class collections.abc.Iterator`7273ABC для классов, которые предоставляют методы [`__iter__()`](https://python-all.ru/3.6/library/stdtypes.html#iterator.__iter__) и [`__next__()`](https://python-all.ru/3.6/library/stdtypes.html#iterator.__next__). См. также определение [итератора](https://python-all.ru/3.6/glossary.html#term-iterator).7475#### `class collections.abc.Reversible`7677ABC для итерируемых классов, которые также предоставляют метод [`__reversed__()`](https://python-all.ru/3.6/reference/datamodel.html#object.__reversed__).7879Новое в версии 3.6.8081#### `class collections.abc.Generator`8283ABC для классов-генераторов, реализующих протокол, определённый в [**PEP 342**](https://python-all.ru/3.6/library/collections.abc.html), который расширяет итераторы методами [`send()`](https://python-all.ru/3.6/reference/expressions.html#generator.send), [`throw()`](https://python-all.ru/3.6/reference/expressions.html#generator.throw) и [`close()`](https://python-all.ru/3.6/reference/expressions.html#generator.close). См. также определение [генератора](https://python-all.ru/3.6/glossary.html#term-generator).8485Новое в версии 3.5.8687#### `class collections.abc.Sequence`8889#### `class collections.abc.MutableSequence`9091#### `class collections.abc.ByteString`9293ABC для неизменяемых и изменяемых [последовательностей](https://python-all.ru/3.6/glossary.html#term-sequence).9495Примечание к реализации: некоторые методы-примеси, такие как [`__iter__()`](https://python-all.ru/3.6/reference/datamodel.html#object.__iter__), [`__reversed__()`](https://python-all.ru/3.6/reference/datamodel.html#object.__reversed__) и `index()`, многократно вызывают базовый метод [`__getitem__()`](https://python-all.ru/3.6/reference/datamodel.html#object.__getitem__). Следовательно, если метод [`__getitem__()`](https://python-all.ru/3.6/reference/datamodel.html#object.__getitem__) реализован с постоянной скоростью доступа, методы-примеси будут иметь линейную производительность; однако, если базовый метод является линейным (как в случае со связным списком), производительность примесей станет квадратичной, и их, скорее всего, придётся переопределить.9697Изменено в версии 3.5: Метод index() получил поддержку *stop* и *start* аргументов.9899#### `class collections.abc.Set`100101#### `class collections.abc.MutableSet`102103ABC для наборов только для чтения и изменяемых наборов.104105#### `class collections.abc.Mapping`106107#### `class collections.abc.MutableMapping`108109ABC для неизменяемых и изменяемых [отображений](https://python-all.ru/3.6/glossary.html#term-mapping).110111#### `class collections.abc.MappingView`112113#### `class collections.abc.ItemsView`114115#### `class collections.abc.KeysView`116117#### `class collections.abc.ValuesView`118119ABC для [представлений](https://python-all.ru/3.6/glossary.html#term-dictionary-view) отображений, элементов, ключей и значений.120121#### `class collections.abc.Awaitable`122123ABC для [ожидаемых](https://python-all.ru/3.6/glossary.html#term-awaitable) объектов, которые могут использоваться в выражениях [`await`](https://python-all.ru/3.6/reference/expressions.html#await). Пользовательские реализации должны предоставлять метод [`__await__()`](https://python-all.ru/3.6/reference/datamodel.html#object.__await__) .124125Объекты [Coroutine](https://python-all.ru/3.6/glossary.html#term-coroutine) и экземпляры ABC [`Coroutine`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Coroutine) являются экземплярами этого ABC.126127> **Примечание**128>129> В CPython корутины на основе генераторов (генераторы, декорированные [`types.coroutine()`](https://python-all.ru/3.6/library/types.html#types.coroutine) или [`asyncio.coroutine()`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.coroutine)) являются *ожидаемыми объектами*, даже если у них нет метода [`__await__()`](https://python-all.ru/3.6/reference/datamodel.html#object.__await__). Использование `isinstance(gencoro, Awaitable)` для них вернёт `False`. Используйте [`inspect.isawaitable()`](https://python-all.ru/3.6/library/inspect.html#inspect.isawaitable) для их обнаружения.130131Новое в версии 3.5.132133#### `class collections.abc.Coroutine`134135ABC для классов, совместимых с корутинами. Они реализуют следующие методы, определённые в [Объектах корутин](https://python-all.ru/3.6/reference/datamodel.html#coroutine-objects): [`send()`](https://python-all.ru/3.6/reference/datamodel.html#coroutine.send), [`throw()`](https://python-all.ru/3.6/reference/datamodel.html#coroutine.throw) и [`close()`](https://python-all.ru/3.6/reference/datamodel.html#coroutine.close). Пользовательские реализации также должны реализовывать [`__await__()`](https://python-all.ru/3.6/reference/datamodel.html#object.__await__). Все экземпляры [`Coroutine`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Coroutine) также являются экземплярами [`Awaitable`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Awaitable). См. также определение [корутины](https://python-all.ru/3.6/glossary.html#term-coroutine).136137> **Примечание**138>139> В CPython корутины на основе генераторов (генераторы, декорированные [`types.coroutine()`](https://python-all.ru/3.6/library/types.html#types.coroutine) или [`asyncio.coroutine()`](https://python-all.ru/3.6/library/asyncio-task.html#asyncio.coroutine)) являются *ожидаемыми объектами*, даже если у них нет метода [`__await__()`](https://python-all.ru/3.6/reference/datamodel.html#object.__await__). Использование `isinstance(gencoro, Coroutine)` для них вернёт `False`. Используйте [`inspect.isawaitable()`](https://python-all.ru/3.6/library/inspect.html#inspect.isawaitable) для их обнаружения.140141Новое в версии 3.5.142143#### `class collections.abc.AsyncIterable`144145ABC для классов, предоставляющих метод `__aiter__`. См. также определение [асинхронного итерируемого](https://python-all.ru/3.6/glossary.html#term-asynchronous-iterable).146147Новое в версии 3.5.148149#### `class collections.abc.AsyncIterator`150151ABC для классов, предоставляющих методы `__aiter__` и `__anext__`. См. также определение [асинхронного итератора](https://python-all.ru/3.6/glossary.html#term-asynchronous-iterator).152153Новое в версии 3.5.154155#### `class collections.abc.AsyncGenerator`156157ABC для классов асинхронных генераторов, реализующих протокол, определённый в [**PEP 525**](https://python-all.ru/3.6/library/collections.abc.html) и [**PEP 492**](https://python-all.ru/3.6/library/collections.abc.html).158159Новое в версии 3.6.160161Эти ABC позволяют проверять, предоставляют ли классы или их экземпляры определённую функциональность, например:162163```python164size = None165if isinstance(myvar, collections.abc.Sized):166    size = len(myvar)167```168169Некоторые из ABC также полезны в качестве примесей (mixins), упрощающих разработку классов, поддерживающих API контейнеров. Например, чтобы написать класс, поддерживающий полный API [`Set`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Set), достаточно предоставить три основных абстрактных метода: [`__contains__()`](https://python-all.ru/3.6/reference/datamodel.html#object.__contains__), [`__iter__()`](https://python-all.ru/3.6/reference/datamodel.html#object.__iter__) и [`__len__()`](https://python-all.ru/3.6/reference/datamodel.html#object.__len__). ABC предоставляет остальные методы, такие как [`__and__()`](https://python-all.ru/3.6/reference/datamodel.html#object.__and__) и `isdisjoint()`:170171```python172class ListBasedSet(collections.abc.Set):173    ''' Альтернативная реализация множества, ориентированная на экономию памяти, а не на скорость174        и не требующая, чтобы элементы множества были хэшируемыми. '''175    def __init__(self, iterable):176        self.elements = lst = []177        for value in iterable:178            if value not in lst:179                lst.append(value)180181    def __iter__(self):182        return iter(self.elements)183184    def __contains__(self, value):185        return value in self.elements186187    def __len__(self):188        return len(self.elements)189190s1 = ListBasedSet('abcdef')191s2 = ListBasedSet('defghi')192overlap = s1 & s2            # Метод __and__() поддерживается автоматически193```194195Замечания по использованию [`Set`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Set) и [`MutableSet`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.MutableSet) в качестве примеси:1961971. Поскольку некоторые операции над множествами создают новые множества, методам примесей по умолчанию нужен способ создавать новые экземпляры из итерируемого объекта. Предполагается, что конструктор класса имеет сигнатуру вида `ClassName(iterable)`. Это допущение вынесено во внутренний метод класса `_from_iterable()`, который вызывает `cls(iterable)` для создания нового множества. Если примесь [`Set`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Set) используется в классе с другой сигнатурой конструктора, потребуется переопределить `_from_iterable()` методом класса, который умеет создавать новые экземпляры из итерируемого аргумента.1982. Чтобы переопределить сравнения (предположительно для скорости, так как семантика фиксирована), переопределите [`__le__()`](https://python-all.ru/3.6/reference/datamodel.html#object.__le__) и [`__ge__()`](https://python-all.ru/3.6/reference/datamodel.html#object.__ge__), тогда остальные операции будут автоматически им следовать.1993. Миксин [`Set`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Set) предоставляет метод `_hash()` для вычисления хеша множества; однако [`__hash__()`](https://python-all.ru/3.6/reference/datamodel.html#object.__hash__) не определён, так как не все множества хешируемы или неизменяемы. Чтобы добавить хешируемость множества с помощью миксинов, унаследуйте от обоих [`Set()`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Set) и [`Hashable()`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.Hashable), а затем определите `__hash__ = Set._hash`.200201> **См. также**202>203> - [Рецепт OrderedSet](https://python-all.ru/3.6/library/collections.abc.html) для примера, построенного на [`MutableSet`](https://python-all.ru/3.6/library/collections.abc.html#collections.abc.MutableSet).204> - Для получения дополнительной информации об ABC см. модуль [`abc`](https://python-all.ru/3.6/library/abc.html#module-abc) и .205