17db96d56Sopenharmony_ci:mod:`collections.abc` --- Abstract Base Classes for Containers
27db96d56Sopenharmony_ci===============================================================
37db96d56Sopenharmony_ci
47db96d56Sopenharmony_ci.. module:: collections.abc
57db96d56Sopenharmony_ci   :synopsis: Abstract base classes for containers
67db96d56Sopenharmony_ci
77db96d56Sopenharmony_ci.. moduleauthor:: Raymond Hettinger <python at rcn.com>
87db96d56Sopenharmony_ci.. sectionauthor:: Raymond Hettinger <python at rcn.com>
97db96d56Sopenharmony_ci
107db96d56Sopenharmony_ci.. versionadded:: 3.3
117db96d56Sopenharmony_ci   Formerly, this module was part of the :mod:`collections` module.
127db96d56Sopenharmony_ci
137db96d56Sopenharmony_ci**Source code:** :source:`Lib/_collections_abc.py`
147db96d56Sopenharmony_ci
157db96d56Sopenharmony_ci.. testsetup:: *
167db96d56Sopenharmony_ci
177db96d56Sopenharmony_ci   from collections.abc import *
187db96d56Sopenharmony_ci   import itertools
197db96d56Sopenharmony_ci   __name__ = '<doctest>'
207db96d56Sopenharmony_ci
217db96d56Sopenharmony_ci--------------
227db96d56Sopenharmony_ci
237db96d56Sopenharmony_ciThis module provides :term:`abstract base classes <abstract base class>` that
247db96d56Sopenharmony_cican be used to test whether a class provides a particular interface; for
257db96d56Sopenharmony_ciexample, whether it is :term:`hashable` or whether it is a mapping.
267db96d56Sopenharmony_ci
277db96d56Sopenharmony_ciAn :func:`issubclass` or :func:`isinstance` test for an interface works in one
287db96d56Sopenharmony_ciof three ways.
297db96d56Sopenharmony_ci
307db96d56Sopenharmony_ci1) A newly written class can inherit directly from one of the
317db96d56Sopenharmony_ciabstract base classes.  The class must supply the required abstract
327db96d56Sopenharmony_cimethods.  The remaining mixin methods come from inheritance and can be
337db96d56Sopenharmony_cioverridden if desired.  Other methods may be added as needed:
347db96d56Sopenharmony_ci
357db96d56Sopenharmony_ci.. testcode::
367db96d56Sopenharmony_ci
377db96d56Sopenharmony_ci    class C(Sequence):                      # Direct inheritance
387db96d56Sopenharmony_ci        def __init__(self): ...             # Extra method not required by the ABC
397db96d56Sopenharmony_ci        def __getitem__(self, index):  ...  # Required abstract method
407db96d56Sopenharmony_ci        def __len__(self):  ...             # Required abstract method
417db96d56Sopenharmony_ci        def count(self, value): ...         # Optionally override a mixin method
427db96d56Sopenharmony_ci
437db96d56Sopenharmony_ci.. doctest::
447db96d56Sopenharmony_ci
457db96d56Sopenharmony_ci   >>> issubclass(C, Sequence)
467db96d56Sopenharmony_ci   True
477db96d56Sopenharmony_ci   >>> isinstance(C(), Sequence)
487db96d56Sopenharmony_ci   True
497db96d56Sopenharmony_ci
507db96d56Sopenharmony_ci2) Existing classes and built-in classes can be registered as "virtual
517db96d56Sopenharmony_cisubclasses" of the ABCs.  Those classes should define the full API
527db96d56Sopenharmony_ciincluding all of the abstract methods and all of the mixin methods.
537db96d56Sopenharmony_ciThis lets users rely on :func:`issubclass` or :func:`isinstance` tests
547db96d56Sopenharmony_cito determine whether the full interface is supported.  The exception to
557db96d56Sopenharmony_cithis rule is for methods that are automatically inferred from the rest
567db96d56Sopenharmony_ciof the API:
577db96d56Sopenharmony_ci
587db96d56Sopenharmony_ci.. testcode::
597db96d56Sopenharmony_ci
607db96d56Sopenharmony_ci    class D:                                 # No inheritance
617db96d56Sopenharmony_ci        def __init__(self): ...              # Extra method not required by the ABC
627db96d56Sopenharmony_ci        def __getitem__(self, index):  ...   # Abstract method
637db96d56Sopenharmony_ci        def __len__(self):  ...              # Abstract method
647db96d56Sopenharmony_ci        def count(self, value): ...          # Mixin method
657db96d56Sopenharmony_ci        def index(self, value): ...          # Mixin method
667db96d56Sopenharmony_ci
677db96d56Sopenharmony_ci    Sequence.register(D)                     # Register instead of inherit
687db96d56Sopenharmony_ci
697db96d56Sopenharmony_ci.. doctest::
707db96d56Sopenharmony_ci
717db96d56Sopenharmony_ci   >>> issubclass(D, Sequence)
727db96d56Sopenharmony_ci   True
737db96d56Sopenharmony_ci   >>> isinstance(D(), Sequence)
747db96d56Sopenharmony_ci   True
757db96d56Sopenharmony_ci
767db96d56Sopenharmony_ciIn this example, class :class:`D` does not need to define
777db96d56Sopenharmony_ci``__contains__``, ``__iter__``, and ``__reversed__`` because the
787db96d56Sopenharmony_ci:ref:`in-operator <comparisons>`, the :term:`iteration <iterable>`
797db96d56Sopenharmony_cilogic, and the :func:`reversed` function automatically fall back to
807db96d56Sopenharmony_ciusing ``__getitem__`` and ``__len__``.
817db96d56Sopenharmony_ci
827db96d56Sopenharmony_ci3) Some simple interfaces are directly recognizable by the presence of
837db96d56Sopenharmony_cithe required methods (unless those methods have been set to
847db96d56Sopenharmony_ci:const:`None`):
857db96d56Sopenharmony_ci
867db96d56Sopenharmony_ci.. testcode::
877db96d56Sopenharmony_ci
887db96d56Sopenharmony_ci    class E:
897db96d56Sopenharmony_ci        def __iter__(self): ...
907db96d56Sopenharmony_ci        def __next__(next): ...
917db96d56Sopenharmony_ci
927db96d56Sopenharmony_ci.. doctest::
937db96d56Sopenharmony_ci
947db96d56Sopenharmony_ci   >>> issubclass(E, Iterable)
957db96d56Sopenharmony_ci   True
967db96d56Sopenharmony_ci   >>> isinstance(E(), Iterable)
977db96d56Sopenharmony_ci   True
987db96d56Sopenharmony_ci
997db96d56Sopenharmony_ciComplex interfaces do not support this last technique because an
1007db96d56Sopenharmony_ciinterface is more than just the presence of method names.  Interfaces
1017db96d56Sopenharmony_cispecify semantics and relationships between methods that cannot be
1027db96d56Sopenharmony_ciinferred solely from the presence of specific method names.  For
1037db96d56Sopenharmony_ciexample, knowing that a class supplies ``__getitem__``, ``__len__``, and
1047db96d56Sopenharmony_ci``__iter__`` is insufficient for distinguishing a :class:`Sequence` from
1057db96d56Sopenharmony_cia :class:`Mapping`.
1067db96d56Sopenharmony_ci
1077db96d56Sopenharmony_ci.. versionadded:: 3.9
1087db96d56Sopenharmony_ci   These abstract classes now support ``[]``. See :ref:`types-genericalias`
1097db96d56Sopenharmony_ci   and :pep:`585`.
1107db96d56Sopenharmony_ci
1117db96d56Sopenharmony_ci.. _collections-abstract-base-classes:
1127db96d56Sopenharmony_ci
1137db96d56Sopenharmony_ciCollections Abstract Base Classes
1147db96d56Sopenharmony_ci---------------------------------
1157db96d56Sopenharmony_ci
1167db96d56Sopenharmony_ciThe collections module offers the following :term:`ABCs <abstract base class>`:
1177db96d56Sopenharmony_ci
1187db96d56Sopenharmony_ci.. tabularcolumns:: |l|L|L|L|
1197db96d56Sopenharmony_ci
1207db96d56Sopenharmony_ci============================== ====================== ======================= ====================================================
1217db96d56Sopenharmony_ciABC                            Inherits from          Abstract Methods        Mixin Methods
1227db96d56Sopenharmony_ci============================== ====================== ======================= ====================================================
1237db96d56Sopenharmony_ci:class:`Container` [1]_                               ``__contains__``
1247db96d56Sopenharmony_ci:class:`Hashable` [1]_                                ``__hash__``
1257db96d56Sopenharmony_ci:class:`Iterable` [1]_ [2]_                           ``__iter__``
1267db96d56Sopenharmony_ci:class:`Iterator` [1]_         :class:`Iterable`      ``__next__``            ``__iter__``
1277db96d56Sopenharmony_ci:class:`Reversible` [1]_       :class:`Iterable`      ``__reversed__``
1287db96d56Sopenharmony_ci:class:`Generator`  [1]_       :class:`Iterator`      ``send``, ``throw``     ``close``, ``__iter__``, ``__next__``
1297db96d56Sopenharmony_ci:class:`Sized`  [1]_                                  ``__len__``
1307db96d56Sopenharmony_ci:class:`Callable`  [1]_                               ``__call__``
1317db96d56Sopenharmony_ci:class:`Collection`  [1]_      :class:`Sized`,        ``__contains__``,
1327db96d56Sopenharmony_ci                               :class:`Iterable`,     ``__iter__``,
1337db96d56Sopenharmony_ci                               :class:`Container`     ``__len__``
1347db96d56Sopenharmony_ci
1357db96d56Sopenharmony_ci:class:`Sequence`              :class:`Reversible`,   ``__getitem__``,        ``__contains__``, ``__iter__``, ``__reversed__``,
1367db96d56Sopenharmony_ci                               :class:`Collection`    ``__len__``             ``index``, and ``count``
1377db96d56Sopenharmony_ci
1387db96d56Sopenharmony_ci:class:`MutableSequence`       :class:`Sequence`      ``__getitem__``,        Inherited :class:`Sequence` methods and
1397db96d56Sopenharmony_ci                                                      ``__setitem__``,        ``append``, ``reverse``, ``extend``, ``pop``,
1407db96d56Sopenharmony_ci                                                      ``__delitem__``,        ``remove``, and ``__iadd__``
1417db96d56Sopenharmony_ci                                                      ``__len__``,
1427db96d56Sopenharmony_ci                                                      ``insert``
1437db96d56Sopenharmony_ci
1447db96d56Sopenharmony_ci:class:`ByteString`            :class:`Sequence`      ``__getitem__``,        Inherited :class:`Sequence` methods
1457db96d56Sopenharmony_ci                                                      ``__len__``
1467db96d56Sopenharmony_ci
1477db96d56Sopenharmony_ci:class:`Set`                   :class:`Collection`    ``__contains__``,       ``__le__``, ``__lt__``, ``__eq__``, ``__ne__``,
1487db96d56Sopenharmony_ci                                                      ``__iter__``,           ``__gt__``, ``__ge__``, ``__and__``, ``__or__``,
1497db96d56Sopenharmony_ci                                                      ``__len__``             ``__sub__``, ``__xor__``, and ``isdisjoint``
1507db96d56Sopenharmony_ci
1517db96d56Sopenharmony_ci:class:`MutableSet`            :class:`Set`           ``__contains__``,       Inherited :class:`Set` methods and
1527db96d56Sopenharmony_ci                                                      ``__iter__``,           ``clear``, ``pop``, ``remove``, ``__ior__``,
1537db96d56Sopenharmony_ci                                                      ``__len__``,            ``__iand__``, ``__ixor__``, and ``__isub__``
1547db96d56Sopenharmony_ci                                                      ``add``,
1557db96d56Sopenharmony_ci                                                      ``discard``
1567db96d56Sopenharmony_ci
1577db96d56Sopenharmony_ci:class:`Mapping`               :class:`Collection`    ``__getitem__``,        ``__contains__``, ``keys``, ``items``, ``values``,
1587db96d56Sopenharmony_ci                                                      ``__iter__``,           ``get``, ``__eq__``, and ``__ne__``
1597db96d56Sopenharmony_ci                                                      ``__len__``
1607db96d56Sopenharmony_ci
1617db96d56Sopenharmony_ci:class:`MutableMapping`        :class:`Mapping`       ``__getitem__``,        Inherited :class:`Mapping` methods and
1627db96d56Sopenharmony_ci                                                      ``__setitem__``,        ``pop``, ``popitem``, ``clear``, ``update``,
1637db96d56Sopenharmony_ci                                                      ``__delitem__``,        and ``setdefault``
1647db96d56Sopenharmony_ci                                                      ``__iter__``,
1657db96d56Sopenharmony_ci                                                      ``__len__``
1667db96d56Sopenharmony_ci
1677db96d56Sopenharmony_ci
1687db96d56Sopenharmony_ci:class:`MappingView`           :class:`Sized`                                 ``__len__``
1697db96d56Sopenharmony_ci:class:`ItemsView`             :class:`MappingView`,                          ``__contains__``,
1707db96d56Sopenharmony_ci                               :class:`Set`                                   ``__iter__``
1717db96d56Sopenharmony_ci:class:`KeysView`              :class:`MappingView`,                          ``__contains__``,
1727db96d56Sopenharmony_ci                               :class:`Set`                                   ``__iter__``
1737db96d56Sopenharmony_ci:class:`ValuesView`            :class:`MappingView`,                          ``__contains__``, ``__iter__``
1747db96d56Sopenharmony_ci                               :class:`Collection`
1757db96d56Sopenharmony_ci:class:`Awaitable` [1]_                               ``__await__``
1767db96d56Sopenharmony_ci:class:`Coroutine` [1]_        :class:`Awaitable`     ``send``, ``throw``     ``close``
1777db96d56Sopenharmony_ci:class:`AsyncIterable` [1]_                           ``__aiter__``
1787db96d56Sopenharmony_ci:class:`AsyncIterator` [1]_    :class:`AsyncIterable` ``__anext__``           ``__aiter__``
1797db96d56Sopenharmony_ci:class:`AsyncGenerator` [1]_   :class:`AsyncIterator` ``asend``, ``athrow``   ``aclose``, ``__aiter__``, ``__anext__``
1807db96d56Sopenharmony_ci============================== ====================== ======================= ====================================================
1817db96d56Sopenharmony_ci
1827db96d56Sopenharmony_ci
1837db96d56Sopenharmony_ci.. rubric:: Footnotes
1847db96d56Sopenharmony_ci
1857db96d56Sopenharmony_ci.. [1] These ABCs override :meth:`object.__subclasshook__` to support
1867db96d56Sopenharmony_ci   testing an interface by verifying the required methods are present
1877db96d56Sopenharmony_ci   and have not been set to :const:`None`.  This only works for simple
1887db96d56Sopenharmony_ci   interfaces.  More complex interfaces require registration or direct
1897db96d56Sopenharmony_ci   subclassing.
1907db96d56Sopenharmony_ci
1917db96d56Sopenharmony_ci.. [2] Checking ``isinstance(obj, Iterable)`` detects classes that are
1927db96d56Sopenharmony_ci   registered as :class:`Iterable` or that have an :meth:`__iter__`
1937db96d56Sopenharmony_ci   method, but it does not detect classes that iterate with the
1947db96d56Sopenharmony_ci   :meth:`__getitem__` method.  The only reliable way to determine
1957db96d56Sopenharmony_ci   whether an object is :term:`iterable` is to call ``iter(obj)``.
1967db96d56Sopenharmony_ci
1977db96d56Sopenharmony_ci
1987db96d56Sopenharmony_ciCollections Abstract Base Classes -- Detailed Descriptions
1997db96d56Sopenharmony_ci----------------------------------------------------------
2007db96d56Sopenharmony_ci
2017db96d56Sopenharmony_ci
2027db96d56Sopenharmony_ci.. class:: Container
2037db96d56Sopenharmony_ci
2047db96d56Sopenharmony_ci   ABC for classes that provide the :meth:`__contains__` method.
2057db96d56Sopenharmony_ci
2067db96d56Sopenharmony_ci.. class:: Hashable
2077db96d56Sopenharmony_ci
2087db96d56Sopenharmony_ci   ABC for classes that provide the :meth:`__hash__` method.
2097db96d56Sopenharmony_ci
2107db96d56Sopenharmony_ci.. class:: Sized
2117db96d56Sopenharmony_ci
2127db96d56Sopenharmony_ci   ABC for classes that provide the :meth:`__len__` method.
2137db96d56Sopenharmony_ci
2147db96d56Sopenharmony_ci.. class:: Callable
2157db96d56Sopenharmony_ci
2167db96d56Sopenharmony_ci   ABC for classes that provide the :meth:`__call__` method.
2177db96d56Sopenharmony_ci
2187db96d56Sopenharmony_ci.. class:: Iterable
2197db96d56Sopenharmony_ci
2207db96d56Sopenharmony_ci   ABC for classes that provide the :meth:`__iter__` method.
2217db96d56Sopenharmony_ci
2227db96d56Sopenharmony_ci   Checking ``isinstance(obj, Iterable)`` detects classes that are registered
2237db96d56Sopenharmony_ci   as :class:`Iterable` or that have an :meth:`__iter__` method, but it does
2247db96d56Sopenharmony_ci   not detect classes that iterate with the :meth:`__getitem__` method.
2257db96d56Sopenharmony_ci   The only reliable way to determine whether an object is :term:`iterable`
2267db96d56Sopenharmony_ci   is to call ``iter(obj)``.
2277db96d56Sopenharmony_ci
2287db96d56Sopenharmony_ci.. class:: Collection
2297db96d56Sopenharmony_ci
2307db96d56Sopenharmony_ci   ABC for sized iterable container classes.
2317db96d56Sopenharmony_ci
2327db96d56Sopenharmony_ci   .. versionadded:: 3.6
2337db96d56Sopenharmony_ci
2347db96d56Sopenharmony_ci.. class:: Iterator
2357db96d56Sopenharmony_ci
2367db96d56Sopenharmony_ci   ABC for classes that provide the :meth:`~iterator.__iter__` and
2377db96d56Sopenharmony_ci   :meth:`~iterator.__next__` methods.  See also the definition of
2387db96d56Sopenharmony_ci   :term:`iterator`.
2397db96d56Sopenharmony_ci
2407db96d56Sopenharmony_ci.. class:: Reversible
2417db96d56Sopenharmony_ci
2427db96d56Sopenharmony_ci   ABC for iterable classes that also provide the :meth:`__reversed__`
2437db96d56Sopenharmony_ci   method.
2447db96d56Sopenharmony_ci
2457db96d56Sopenharmony_ci   .. versionadded:: 3.6
2467db96d56Sopenharmony_ci
2477db96d56Sopenharmony_ci.. class:: Generator
2487db96d56Sopenharmony_ci
2497db96d56Sopenharmony_ci   ABC for generator classes that implement the protocol defined in
2507db96d56Sopenharmony_ci   :pep:`342` that extends iterators with the :meth:`~generator.send`,
2517db96d56Sopenharmony_ci   :meth:`~generator.throw` and :meth:`~generator.close` methods.
2527db96d56Sopenharmony_ci   See also the definition of :term:`generator`.
2537db96d56Sopenharmony_ci
2547db96d56Sopenharmony_ci   .. versionadded:: 3.5
2557db96d56Sopenharmony_ci
2567db96d56Sopenharmony_ci.. class:: Sequence
2577db96d56Sopenharmony_ci           MutableSequence
2587db96d56Sopenharmony_ci           ByteString
2597db96d56Sopenharmony_ci
2607db96d56Sopenharmony_ci   ABCs for read-only and mutable :term:`sequences <sequence>`.
2617db96d56Sopenharmony_ci
2627db96d56Sopenharmony_ci   Implementation note: Some of the mixin methods, such as
2637db96d56Sopenharmony_ci   :meth:`__iter__`, :meth:`__reversed__` and :meth:`index`, make
2647db96d56Sopenharmony_ci   repeated calls to the underlying :meth:`__getitem__` method.
2657db96d56Sopenharmony_ci   Consequently, if :meth:`__getitem__` is implemented with constant
2667db96d56Sopenharmony_ci   access speed, the mixin methods will have linear performance;
2677db96d56Sopenharmony_ci   however, if the underlying method is linear (as it would be with a
2687db96d56Sopenharmony_ci   linked list), the mixins will have quadratic performance and will
2697db96d56Sopenharmony_ci   likely need to be overridden.
2707db96d56Sopenharmony_ci
2717db96d56Sopenharmony_ci   .. versionchanged:: 3.5
2727db96d56Sopenharmony_ci      The index() method added support for *stop* and *start*
2737db96d56Sopenharmony_ci      arguments.
2747db96d56Sopenharmony_ci
2757db96d56Sopenharmony_ci.. class:: Set
2767db96d56Sopenharmony_ci           MutableSet
2777db96d56Sopenharmony_ci
2787db96d56Sopenharmony_ci   ABCs for read-only and mutable sets.
2797db96d56Sopenharmony_ci
2807db96d56Sopenharmony_ci.. class:: Mapping
2817db96d56Sopenharmony_ci           MutableMapping
2827db96d56Sopenharmony_ci
2837db96d56Sopenharmony_ci   ABCs for read-only and mutable :term:`mappings <mapping>`.
2847db96d56Sopenharmony_ci
2857db96d56Sopenharmony_ci.. class:: MappingView
2867db96d56Sopenharmony_ci           ItemsView
2877db96d56Sopenharmony_ci           KeysView
2887db96d56Sopenharmony_ci           ValuesView
2897db96d56Sopenharmony_ci
2907db96d56Sopenharmony_ci   ABCs for mapping, items, keys, and values :term:`views <dictionary view>`.
2917db96d56Sopenharmony_ci
2927db96d56Sopenharmony_ci.. class:: Awaitable
2937db96d56Sopenharmony_ci
2947db96d56Sopenharmony_ci   ABC for :term:`awaitable` objects, which can be used in :keyword:`await`
2957db96d56Sopenharmony_ci   expressions.  Custom implementations must provide the :meth:`__await__`
2967db96d56Sopenharmony_ci   method.
2977db96d56Sopenharmony_ci
2987db96d56Sopenharmony_ci   :term:`Coroutine <coroutine>` objects and instances of the
2997db96d56Sopenharmony_ci   :class:`~collections.abc.Coroutine` ABC are all instances of this ABC.
3007db96d56Sopenharmony_ci
3017db96d56Sopenharmony_ci   .. note::
3027db96d56Sopenharmony_ci      In CPython, generator-based coroutines (generators decorated with
3037db96d56Sopenharmony_ci      :func:`types.coroutine`) are
3047db96d56Sopenharmony_ci      *awaitables*, even though they do not have an :meth:`__await__` method.
3057db96d56Sopenharmony_ci      Using ``isinstance(gencoro, Awaitable)`` for them will return ``False``.
3067db96d56Sopenharmony_ci      Use :func:`inspect.isawaitable` to detect them.
3077db96d56Sopenharmony_ci
3087db96d56Sopenharmony_ci   .. versionadded:: 3.5
3097db96d56Sopenharmony_ci
3107db96d56Sopenharmony_ci.. class:: Coroutine
3117db96d56Sopenharmony_ci
3127db96d56Sopenharmony_ci   ABC for coroutine compatible classes.  These implement the
3137db96d56Sopenharmony_ci   following methods, defined in :ref:`coroutine-objects`:
3147db96d56Sopenharmony_ci   :meth:`~coroutine.send`, :meth:`~coroutine.throw`, and
3157db96d56Sopenharmony_ci   :meth:`~coroutine.close`.  Custom implementations must also implement
3167db96d56Sopenharmony_ci   :meth:`__await__`.  All :class:`Coroutine` instances are also instances of
3177db96d56Sopenharmony_ci   :class:`Awaitable`.  See also the definition of :term:`coroutine`.
3187db96d56Sopenharmony_ci
3197db96d56Sopenharmony_ci   .. note::
3207db96d56Sopenharmony_ci      In CPython, generator-based coroutines (generators decorated with
3217db96d56Sopenharmony_ci      :func:`types.coroutine`) are
3227db96d56Sopenharmony_ci      *awaitables*, even though they do not have an :meth:`__await__` method.
3237db96d56Sopenharmony_ci      Using ``isinstance(gencoro, Coroutine)`` for them will return ``False``.
3247db96d56Sopenharmony_ci      Use :func:`inspect.isawaitable` to detect them.
3257db96d56Sopenharmony_ci
3267db96d56Sopenharmony_ci   .. versionadded:: 3.5
3277db96d56Sopenharmony_ci
3287db96d56Sopenharmony_ci.. class:: AsyncIterable
3297db96d56Sopenharmony_ci
3307db96d56Sopenharmony_ci   ABC for classes that provide ``__aiter__`` method.  See also the
3317db96d56Sopenharmony_ci   definition of :term:`asynchronous iterable`.
3327db96d56Sopenharmony_ci
3337db96d56Sopenharmony_ci   .. versionadded:: 3.5
3347db96d56Sopenharmony_ci
3357db96d56Sopenharmony_ci.. class:: AsyncIterator
3367db96d56Sopenharmony_ci
3377db96d56Sopenharmony_ci   ABC for classes that provide ``__aiter__`` and ``__anext__``
3387db96d56Sopenharmony_ci   methods.  See also the definition of :term:`asynchronous iterator`.
3397db96d56Sopenharmony_ci
3407db96d56Sopenharmony_ci   .. versionadded:: 3.5
3417db96d56Sopenharmony_ci
3427db96d56Sopenharmony_ci.. class:: AsyncGenerator
3437db96d56Sopenharmony_ci
3447db96d56Sopenharmony_ci   ABC for asynchronous generator classes that implement the protocol
3457db96d56Sopenharmony_ci   defined in :pep:`525` and :pep:`492`.
3467db96d56Sopenharmony_ci
3477db96d56Sopenharmony_ci   .. versionadded:: 3.6
3487db96d56Sopenharmony_ci
3497db96d56Sopenharmony_ciExamples and Recipes
3507db96d56Sopenharmony_ci--------------------
3517db96d56Sopenharmony_ci
3527db96d56Sopenharmony_ciABCs allow us to ask classes or instances if they provide
3537db96d56Sopenharmony_ciparticular functionality, for example::
3547db96d56Sopenharmony_ci
3557db96d56Sopenharmony_ci    size = None
3567db96d56Sopenharmony_ci    if isinstance(myvar, collections.abc.Sized):
3577db96d56Sopenharmony_ci        size = len(myvar)
3587db96d56Sopenharmony_ci
3597db96d56Sopenharmony_ciSeveral of the ABCs are also useful as mixins that make it easier to develop
3607db96d56Sopenharmony_ciclasses supporting container APIs.  For example, to write a class supporting
3617db96d56Sopenharmony_cithe full :class:`Set` API, it is only necessary to supply the three underlying
3627db96d56Sopenharmony_ciabstract methods: :meth:`__contains__`, :meth:`__iter__`, and :meth:`__len__`.
3637db96d56Sopenharmony_ciThe ABC supplies the remaining methods such as :meth:`__and__` and
3647db96d56Sopenharmony_ci:meth:`isdisjoint`::
3657db96d56Sopenharmony_ci
3667db96d56Sopenharmony_ci    class ListBasedSet(collections.abc.Set):
3677db96d56Sopenharmony_ci        ''' Alternate set implementation favoring space over speed
3687db96d56Sopenharmony_ci            and not requiring the set elements to be hashable. '''
3697db96d56Sopenharmony_ci        def __init__(self, iterable):
3707db96d56Sopenharmony_ci            self.elements = lst = []
3717db96d56Sopenharmony_ci            for value in iterable:
3727db96d56Sopenharmony_ci                if value not in lst:
3737db96d56Sopenharmony_ci                    lst.append(value)
3747db96d56Sopenharmony_ci
3757db96d56Sopenharmony_ci        def __iter__(self):
3767db96d56Sopenharmony_ci            return iter(self.elements)
3777db96d56Sopenharmony_ci
3787db96d56Sopenharmony_ci        def __contains__(self, value):
3797db96d56Sopenharmony_ci            return value in self.elements
3807db96d56Sopenharmony_ci
3817db96d56Sopenharmony_ci        def __len__(self):
3827db96d56Sopenharmony_ci            return len(self.elements)
3837db96d56Sopenharmony_ci
3847db96d56Sopenharmony_ci    s1 = ListBasedSet('abcdef')
3857db96d56Sopenharmony_ci    s2 = ListBasedSet('defghi')
3867db96d56Sopenharmony_ci    overlap = s1 & s2            # The __and__() method is supported automatically
3877db96d56Sopenharmony_ci
3887db96d56Sopenharmony_ciNotes on using :class:`Set` and :class:`MutableSet` as a mixin:
3897db96d56Sopenharmony_ci
3907db96d56Sopenharmony_ci(1)
3917db96d56Sopenharmony_ci   Since some set operations create new sets, the default mixin methods need
3927db96d56Sopenharmony_ci   a way to create new instances from an iterable. The class constructor is
3937db96d56Sopenharmony_ci   assumed to have a signature in the form ``ClassName(iterable)``.
3947db96d56Sopenharmony_ci   That assumption is factored-out to an internal classmethod called
3957db96d56Sopenharmony_ci   :meth:`_from_iterable` which calls ``cls(iterable)`` to produce a new set.
3967db96d56Sopenharmony_ci   If the :class:`Set` mixin is being used in a class with a different
3977db96d56Sopenharmony_ci   constructor signature, you will need to override :meth:`_from_iterable`
3987db96d56Sopenharmony_ci   with a classmethod or regular method that can construct new instances from
3997db96d56Sopenharmony_ci   an iterable argument.
4007db96d56Sopenharmony_ci
4017db96d56Sopenharmony_ci(2)
4027db96d56Sopenharmony_ci   To override the comparisons (presumably for speed, as the
4037db96d56Sopenharmony_ci   semantics are fixed), redefine :meth:`__le__` and :meth:`__ge__`,
4047db96d56Sopenharmony_ci   then the other operations will automatically follow suit.
4057db96d56Sopenharmony_ci
4067db96d56Sopenharmony_ci(3)
4077db96d56Sopenharmony_ci   The :class:`Set` mixin provides a :meth:`_hash` method to compute a hash value
4087db96d56Sopenharmony_ci   for the set; however, :meth:`__hash__` is not defined because not all sets
4097db96d56Sopenharmony_ci   are :term:`hashable` or immutable.  To add set hashability using mixins,
4107db96d56Sopenharmony_ci   inherit from both :meth:`Set` and :meth:`Hashable`, then define
4117db96d56Sopenharmony_ci   ``__hash__ = Set._hash``.
4127db96d56Sopenharmony_ci
4137db96d56Sopenharmony_ci.. seealso::
4147db96d56Sopenharmony_ci
4157db96d56Sopenharmony_ci   * `OrderedSet recipe <https://code.activestate.com/recipes/576694/>`_ for an
4167db96d56Sopenharmony_ci     example built on :class:`MutableSet`.
4177db96d56Sopenharmony_ci
4187db96d56Sopenharmony_ci   * For more about ABCs, see the :mod:`abc` module and :pep:`3119`.
419