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