Home | History | Annotate | Download | only in library
      1 :mod:`collections.abc` --- Abstract Base Classes for Containers
      2 ===============================================================
      3 
      4 .. module:: collections.abc
      5    :synopsis: Abstract base classes for containers
      6 
      7 .. moduleauthor:: Raymond Hettinger <python at rcn.com>
      8 .. sectionauthor:: Raymond Hettinger <python at rcn.com>
      9 
     10 .. versionadded:: 3.3
     11    Formerly, this module was part of the :mod:`collections` module.
     12 
     13 **Source code:** :source:`Lib/_collections_abc.py`
     14 
     15 .. testsetup:: *
     16 
     17    from collections import *
     18    import itertools
     19    __name__ = '<doctest>'
     20 
     21 --------------
     22 
     23 This module provides :term:`abstract base classes <abstract base class>` that
     24 can be used to test whether a class provides a particular interface; for
     25 example, whether it is hashable or whether it is a mapping.
     26 
     27 
     28 .. _collections-abstract-base-classes:
     29 
     30 Collections Abstract Base Classes
     31 ---------------------------------
     32 
     33 The collections module offers the following :term:`ABCs <abstract base class>`:
     34 
     35 .. tabularcolumns:: |l|L|L|L|
     36 
     37 ========================== ====================== ======================= ====================================================
     38 ABC                        Inherits from          Abstract Methods        Mixin Methods
     39 ========================== ====================== ======================= ====================================================
     40 :class:`Container`                                ``__contains__``
     41 :class:`Hashable`                                 ``__hash__``
     42 :class:`Iterable`                                 ``__iter__``
     43 :class:`Iterator`          :class:`Iterable`      ``__next__``            ``__iter__``
     44 :class:`Reversible`        :class:`Iterable`      ``__reversed__``
     45 :class:`Generator`         :class:`Iterator`      ``send``, ``throw``     ``close``, ``__iter__``, ``__next__``
     46 :class:`Sized`                                    ``__len__``
     47 :class:`Callable`                                 ``__call__``
     48 :class:`Collection`        :class:`Sized`,        ``__contains__``,
     49                            :class:`Iterable`,     ``__iter__``,
     50                            :class:`Container`     ``__len__``
     51 
     52 :class:`Sequence`          :class:`Reversible`,   ``__getitem__``,        ``__contains__``, ``__iter__``, ``__reversed__``,
     53                            :class:`Collection`    ``__len__``             ``index``, and ``count``
     54 
     55 :class:`MutableSequence`   :class:`Sequence`      ``__getitem__``,        Inherited :class:`Sequence` methods and
     56                                                   ``__setitem__``,        ``append``, ``reverse``, ``extend``, ``pop``,
     57                                                   ``__delitem__``,        ``remove``, and ``__iadd__``
     58                                                   ``__len__``,
     59                                                   ``insert``
     60 
     61 :class:`ByteString`        :class:`Sequence`      ``__getitem__``,        Inherited :class:`Sequence` methods
     62                                                   ``__len__``
     63 
     64 :class:`Set`               :class:`Collection`    ``__contains__``,       ``__le__``, ``__lt__``, ``__eq__``, ``__ne__``,
     65                                                   ``__iter__``,           ``__gt__``, ``__ge__``, ``__and__``, ``__or__``,
     66                                                   ``__len__``             ``__sub__``, ``__xor__``, and ``isdisjoint``
     67 
     68 :class:`MutableSet`        :class:`Set`           ``__contains__``,       Inherited :class:`Set` methods and
     69                                                   ``__iter__``,           ``clear``, ``pop``, ``remove``, ``__ior__``,
     70                                                   ``__len__``,            ``__iand__``, ``__ixor__``, and ``__isub__``
     71                                                   ``add``,
     72                                                   ``discard``
     73 
     74 :class:`Mapping`           :class:`Collection`    ``__getitem__``,        ``__contains__``, ``keys``, ``items``, ``values``,
     75                                                   ``__iter__``,           ``get``, ``__eq__``, and ``__ne__``
     76                                                   ``__len__``
     77 
     78 :class:`MutableMapping`    :class:`Mapping`       ``__getitem__``,        Inherited :class:`Mapping` methods and
     79                                                   ``__setitem__``,        ``pop``, ``popitem``, ``clear``, ``update``,
     80                                                   ``__delitem__``,        and ``setdefault``
     81                                                   ``__iter__``,
     82                                                   ``__len__``
     83 
     84 
     85 :class:`MappingView`       :class:`Sized`                                 ``__len__``
     86 :class:`ItemsView`         :class:`MappingView`,                          ``__contains__``,
     87                            :class:`Set`                                   ``__iter__``
     88 :class:`KeysView`          :class:`MappingView`,                          ``__contains__``,
     89                            :class:`Set`                                   ``__iter__``
     90 :class:`ValuesView`        :class:`MappingView`                           ``__contains__``, ``__iter__``
     91 :class:`Awaitable`                                ``__await__``
     92 :class:`Coroutine`         :class:`Awaitable`     ``send``, ``throw``     ``close``
     93 :class:`AsyncIterable`                            ``__aiter__``
     94 :class:`AsyncIterator`     :class:`AsyncIterable` ``__anext__``           ``__aiter__``
     95 :class:`AsyncGenerator`    :class:`AsyncIterator` ``asend``, ``athrow``   ``aclose``, ``__aiter__``, ``__anext__``
     96 ========================== ====================== ======================= ====================================================
     97 
     98 
     99 .. class:: Container
    100            Hashable
    101            Sized
    102            Callable
    103 
    104    ABCs for classes that provide respectively the methods :meth:`__contains__`,
    105    :meth:`__hash__`, :meth:`__len__`, and :meth:`__call__`.
    106 
    107 .. class:: Iterable
    108 
    109    ABC for classes that provide the :meth:`__iter__` method.
    110    See also the definition of :term:`iterable`.
    111 
    112 .. class:: Collection
    113 
    114    ABC for sized iterable container classes.
    115 
    116    .. versionadded:: 3.6
    117 
    118 .. class:: Iterator
    119 
    120    ABC for classes that provide the :meth:`~iterator.__iter__` and
    121    :meth:`~iterator.__next__` methods.  See also the definition of
    122    :term:`iterator`.
    123 
    124 .. class:: Reversible
    125 
    126    ABC for iterable classes that also provide the :meth:`__reversed__`
    127    method.
    128 
    129    .. versionadded:: 3.6
    130 
    131 .. class:: Generator
    132 
    133    ABC for generator classes that implement the protocol defined in
    134    :pep:`342` that extends iterators with the :meth:`~generator.send`,
    135    :meth:`~generator.throw` and :meth:`~generator.close` methods.
    136    See also the definition of :term:`generator`.
    137 
    138    .. versionadded:: 3.5
    139 
    140 .. class:: Sequence
    141            MutableSequence
    142            ByteString
    143 
    144    ABCs for read-only and mutable :term:`sequences <sequence>`.
    145 
    146    Implementation note: Some of the mixin methods, such as
    147    :meth:`__iter__`, :meth:`__reversed__` and :meth:`index`, make
    148    repeated calls to the underlying :meth:`__getitem__` method.
    149    Consequently, if :meth:`__getitem__` is implemented with constant
    150    access speed, the mixin methods will have linear performance;
    151    however, if the underlying method is linear (as it would be with a
    152    linked list), the mixins will have quadratic performance and will
    153    likely need to be overridden.
    154 
    155    .. versionchanged:: 3.5
    156       The index() method added support for *stop* and *start*
    157       arguments.
    158 
    159 .. class:: Set
    160            MutableSet
    161 
    162    ABCs for read-only and mutable sets.
    163 
    164 .. class:: Mapping
    165            MutableMapping
    166 
    167    ABCs for read-only and mutable :term:`mappings <mapping>`.
    168 
    169 .. class:: MappingView
    170            ItemsView
    171            KeysView
    172            ValuesView
    173 
    174    ABCs for mapping, items, keys, and values :term:`views <dictionary view>`.
    175 
    176 .. class:: Awaitable
    177 
    178    ABC for :term:`awaitable` objects, which can be used in :keyword:`await`
    179    expressions.  Custom implementations must provide the :meth:`__await__`
    180    method.
    181 
    182    :term:`Coroutine` objects and instances of the
    183    :class:`~collections.abc.Coroutine` ABC are all instances of this ABC.
    184 
    185    .. note::
    186       In CPython, generator-based coroutines (generators decorated with
    187       :func:`types.coroutine` or :func:`asyncio.coroutine`) are
    188       *awaitables*, even though they do not have an :meth:`__await__` method.
    189       Using ``isinstance(gencoro, Awaitable)`` for them will return ``False``.
    190       Use :func:`inspect.isawaitable` to detect them.
    191 
    192    .. versionadded:: 3.5
    193 
    194 .. class:: Coroutine
    195 
    196    ABC for coroutine compatible classes.  These implement the
    197    following methods, defined in :ref:`coroutine-objects`:
    198    :meth:`~coroutine.send`, :meth:`~coroutine.throw`, and
    199    :meth:`~coroutine.close`.  Custom implementations must also implement
    200    :meth:`__await__`.  All :class:`Coroutine` instances are also instances of
    201    :class:`Awaitable`.  See also the definition of :term:`coroutine`.
    202 
    203    .. note::
    204       In CPython, generator-based coroutines (generators decorated with
    205       :func:`types.coroutine` or :func:`asyncio.coroutine`) are
    206       *awaitables*, even though they do not have an :meth:`__await__` method.
    207       Using ``isinstance(gencoro, Coroutine)`` for them will return ``False``.
    208       Use :func:`inspect.isawaitable` to detect them.
    209 
    210    .. versionadded:: 3.5
    211 
    212 .. class:: AsyncIterable
    213 
    214    ABC for classes that provide ``__aiter__`` method.  See also the
    215    definition of :term:`asynchronous iterable`.
    216 
    217    .. versionadded:: 3.5
    218 
    219 .. class:: AsyncIterator
    220 
    221    ABC for classes that provide ``__aiter__`` and ``__anext__``
    222    methods.  See also the definition of :term:`asynchronous iterator`.
    223 
    224    .. versionadded:: 3.5
    225 
    226 .. class:: AsyncGenerator
    227 
    228    ABC for asynchronous generator classes that implement the protocol
    229    defined in :pep:`525` and :pep:`492`.
    230 
    231    .. versionadded:: 3.6
    232 
    233 
    234 These ABCs allow us to ask classes or instances if they provide
    235 particular functionality, for example::
    236 
    237     size = None
    238     if isinstance(myvar, collections.abc.Sized):
    239         size = len(myvar)
    240 
    241 Several of the ABCs are also useful as mixins that make it easier to develop
    242 classes supporting container APIs.  For example, to write a class supporting
    243 the full :class:`Set` API, it is only necessary to supply the three underlying
    244 abstract methods: :meth:`__contains__`, :meth:`__iter__`, and :meth:`__len__`.
    245 The ABC supplies the remaining methods such as :meth:`__and__` and
    246 :meth:`isdisjoint`::
    247 
    248     class ListBasedSet(collections.abc.Set):
    249         ''' Alternate set implementation favoring space over speed
    250             and not requiring the set elements to be hashable. '''
    251         def __init__(self, iterable):
    252             self.elements = lst = []
    253             for value in iterable:
    254                 if value not in lst:
    255                     lst.append(value)
    256 
    257         def __iter__(self):
    258             return iter(self.elements)
    259 
    260         def __contains__(self, value):
    261             return value in self.elements
    262 
    263         def __len__(self):
    264             return len(self.elements)
    265 
    266     s1 = ListBasedSet('abcdef')
    267     s2 = ListBasedSet('defghi')
    268     overlap = s1 & s2            # The __and__() method is supported automatically
    269 
    270 Notes on using :class:`Set` and :class:`MutableSet` as a mixin:
    271 
    272 (1)
    273    Since some set operations create new sets, the default mixin methods need
    274    a way to create new instances from an iterable. The class constructor is
    275    assumed to have a signature in the form ``ClassName(iterable)``.
    276    That assumption is factored-out to an internal classmethod called
    277    :meth:`_from_iterable` which calls ``cls(iterable)`` to produce a new set.
    278    If the :class:`Set` mixin is being used in a class with a different
    279    constructor signature, you will need to override :meth:`_from_iterable`
    280    with a classmethod that can construct new instances from
    281    an iterable argument.
    282 
    283 (2)
    284    To override the comparisons (presumably for speed, as the
    285    semantics are fixed), redefine :meth:`__le__` and :meth:`__ge__`,
    286    then the other operations will automatically follow suit.
    287 
    288 (3)
    289    The :class:`Set` mixin provides a :meth:`_hash` method to compute a hash value
    290    for the set; however, :meth:`__hash__` is not defined because not all sets
    291    are hashable or immutable.  To add set hashability using mixins,
    292    inherit from both :meth:`Set` and :meth:`Hashable`, then define
    293    ``__hash__ = Set._hash``.
    294 
    295 .. seealso::
    296 
    297    * `OrderedSet recipe <https://code.activestate.com/recipes/576694/>`_ for an
    298      example built on :class:`MutableSet`.
    299 
    300    * For more about ABCs, see the :mod:`abc` module and :pep:`3119`.
    301