blob: 563c1bc4c5314bf4898c778157197d6f6fc3b236 [file] [log] [blame]
Raymond Hettinger158c9c22011-02-22 00:41:50 +00001:mod:`collections.abc` --- Abstract Base Classes for Containers
2===============================================================
3
4.. module:: collections.abc
5 :synopsis: Abstract base classes for containers
6.. moduleauthor:: Raymond Hettinger <python at rcn.com>
7.. sectionauthor:: Raymond Hettinger <python at rcn.com>
8
Éric Araujob389eec2011-08-16 19:10:24 +02009.. versionadded:: 3.3
10 Formerly, this module was part of the :mod:`collections` module.
11
Raymond Hettinger158c9c22011-02-22 00:41:50 +000012.. testsetup:: *
13
14 from collections import *
15 import itertools
16 __name__ = '<doctest>'
17
Christian Heimesf1dc3ee2013-10-13 02:04:20 +020018**Source code:** :source:`Lib/_collections_abc.py`
Raymond Hettinger158c9c22011-02-22 00:41:50 +000019
20--------------
21
22This module provides :term:`abstract base classes <abstract base class>` that
23can be used to test whether a class provides a particular interface; for
24example, whether it is hashable or whether it is a mapping.
25
Raymond Hettinger158c9c22011-02-22 00:41:50 +000026
Éric Araujof90112e2011-06-03 19:18:41 +020027.. _collections-abstract-base-classes:
Raymond Hettinger158c9c22011-02-22 00:41:50 +000028
29Collections Abstract Base Classes
30---------------------------------
31
Ezio Melottic831a912011-03-28 19:27:09 +030032The collections module offers the following :term:`ABCs <abstract base class>`:
Raymond Hettinger158c9c22011-02-22 00:41:50 +000033
Georg Brandl44ea77b2013-03-28 13:28:44 +010034.. tabularcolumns:: |l|L|L|L|
35
Yury Selivanovf3e40fa2015-05-21 11:50:30 -040036========================== ====================== ======================= ====================================================
Ezio Melottic831a912011-03-28 19:27:09 +030037ABC Inherits from Abstract Methods Mixin Methods
Yury Selivanovf3e40fa2015-05-21 11:50:30 -040038========================== ====================== ======================= ====================================================
Raymond Hettinger158c9c22011-02-22 00:41:50 +000039:class:`Container` ``__contains__``
40:class:`Hashable` ``__hash__``
41:class:`Iterable` ``__iter__``
42:class:`Iterator` :class:`Iterable` ``__next__`` ``__iter__``
Raymond Hettingerbd60e8d2015-05-09 01:07:23 -040043:class:`Generator` :class:`Iterator` ``send``, ``throw`` ``close``, ``__iter__``, ``__next__``
Raymond Hettinger158c9c22011-02-22 00:41:50 +000044:class:`Sized` ``__len__``
45:class:`Callable` ``__call__``
46
Raymond Hettinger3ddba162013-03-23 09:07:36 -070047:class:`Sequence` :class:`Sized`, ``__getitem__``, ``__contains__``, ``__iter__``, ``__reversed__``,
48 :class:`Iterable`, ``__len__`` ``index``, and ``count``
Raymond Hettinger158c9c22011-02-22 00:41:50 +000049 :class:`Container`
50
Raymond Hettinger3ddba162013-03-23 09:07:36 -070051:class:`MutableSequence` :class:`Sequence` ``__getitem__``, Inherited :class:`Sequence` methods and
52 ``__setitem__``, ``append``, ``reverse``, ``extend``, ``pop``,
53 ``__delitem__``, ``remove``, and ``__iadd__``
54 ``__len__``,
55 ``insert``
Raymond Hettinger158c9c22011-02-22 00:41:50 +000056
Raymond Hettinger3ddba162013-03-23 09:07:36 -070057:class:`Set` :class:`Sized`, ``__contains__``, ``__le__``, ``__lt__``, ``__eq__``, ``__ne__``,
58 :class:`Iterable`, ``__iter__``, ``__gt__``, ``__ge__``, ``__and__``, ``__or__``,
59 :class:`Container` ``__len__`` ``__sub__``, ``__xor__``, and ``isdisjoint``
Raymond Hettinger158c9c22011-02-22 00:41:50 +000060
Raymond Hettinger3ddba162013-03-23 09:07:36 -070061:class:`MutableSet` :class:`Set` ``__contains__``, Inherited :class:`Set` methods and
62 ``__iter__``, ``clear``, ``pop``, ``remove``, ``__ior__``,
63 ``__len__``, ``__iand__``, ``__ixor__``, and ``__isub__``
64 ``add``,
65 ``discard``
Raymond Hettinger158c9c22011-02-22 00:41:50 +000066
Raymond Hettinger3ddba162013-03-23 09:07:36 -070067:class:`Mapping` :class:`Sized`, ``__getitem__``, ``__contains__``, ``keys``, ``items``, ``values``,
68 :class:`Iterable`, ``__iter__``, ``get``, ``__eq__``, and ``__ne__``
69 :class:`Container` ``__len__``
Raymond Hettinger158c9c22011-02-22 00:41:50 +000070
Raymond Hettinger3ddba162013-03-23 09:07:36 -070071:class:`MutableMapping` :class:`Mapping` ``__getitem__``, Inherited :class:`Mapping` methods and
72 ``__setitem__``, ``pop``, ``popitem``, ``clear``, ``update``,
73 ``__delitem__``, and ``setdefault``
74 ``__iter__``,
75 ``__len__``
Raymond Hettinger158c9c22011-02-22 00:41:50 +000076
77
78:class:`MappingView` :class:`Sized` ``__len__``
Raymond Hettinger158c9c22011-02-22 00:41:50 +000079:class:`ItemsView` :class:`MappingView`, ``__contains__``,
80 :class:`Set` ``__iter__``
Ezio Melottic831a912011-03-28 19:27:09 +030081:class:`KeysView` :class:`MappingView`, ``__contains__``,
82 :class:`Set` ``__iter__``
Raymond Hettinger158c9c22011-02-22 00:41:50 +000083:class:`ValuesView` :class:`MappingView` ``__contains__``, ``__iter__``
Yury Selivanovf3e40fa2015-05-21 11:50:30 -040084:class:`Awaitable` ``__await__``
Yury Selivanov56fc6142015-05-29 09:01:29 -040085:class:`Coroutine` :class:`Awaitable` ``send``, ``throw`` ``close``
Yury Selivanovf3e40fa2015-05-21 11:50:30 -040086:class:`AsyncIterable` ``__aiter__``
87:class:`AsyncIterator` :class:`AsyncIterable` ``__anext__`` ``__aiter__``
88========================== ====================== ======================= ====================================================
Raymond Hettinger158c9c22011-02-22 00:41:50 +000089
Ezio Melottic831a912011-03-28 19:27:09 +030090
91.. class:: Container
92 Hashable
93 Sized
94 Callable
95
96 ABCs for classes that provide respectively the methods :meth:`__contains__`,
97 :meth:`__hash__`, :meth:`__len__`, and :meth:`__call__`.
98
99.. class:: Iterable
100
101 ABC for classes that provide the :meth:`__iter__` method.
102 See also the definition of :term:`iterable`.
103
104.. class:: Iterator
105
Serhiy Storchakabfdcd432013-10-13 23:09:14 +0300106 ABC for classes that provide the :meth:`~iterator.__iter__` and
107 :meth:`~iterator.__next__` methods. See also the definition of
108 :term:`iterator`.
Ezio Melottic831a912011-03-28 19:27:09 +0300109
Raymond Hettingerbd60e8d2015-05-09 01:07:23 -0400110.. class:: Generator
111
112 ABC for generator classes that implement the protocol defined in
113 :pep:`342` that extends iterators with the :meth:`~generator.send`,
114 :meth:`~generator.throw` and :meth:`~generator.close` methods.
115 See also the definition of :term:`generator`.
116
117 .. versionadded:: 3.5
118
Ezio Melottic831a912011-03-28 19:27:09 +0300119.. class:: Sequence
120 MutableSequence
121
122 ABCs for read-only and mutable :term:`sequences <sequence>`.
123
Raymond Hettingerec219ba2015-05-22 19:29:22 -0700124 Implementation note: Some of the mixin methods, such as
125 :meth:`__iter__`, :meth:`__reversed__` and :meth:`index`, make
126 repeated calls to the underlying :meth:`__getitem__` method.
127 Consequently, if :meth:`__getitem__` is implemented with constant
128 access speed, the mixin methods will have linear performance;
129 however, if the underlying method is linear (as it would be with a
130 linked list), the mixins will have quadratic performance and will
131 likely need to be overridden.
132
133 .. versionchanged:: 3.5
134 The index() method added support for *stop* and *start*
135 arguments.
136
137
Ezio Melottic831a912011-03-28 19:27:09 +0300138.. class:: Set
139 MutableSet
140
141 ABCs for read-only and mutable sets.
142
143.. class:: Mapping
144 MutableMapping
145
146 ABCs for read-only and mutable :term:`mappings <mapping>`.
147
148.. class:: MappingView
149 ItemsView
150 KeysView
151 ValuesView
152
153 ABCs for mapping, items, keys, and values :term:`views <view>`.
154
Yury Selivanovf3e40fa2015-05-21 11:50:30 -0400155.. class:: Awaitable
156
Yury Selivanov66f88282015-06-24 11:04:15 -0400157 ABC for :term:`awaitable` objects, which can be used in :keyword:`await`
158 expressions. Custom implementations must provide the :meth:`__await__`
159 method.
Yury Selivanovf3e40fa2015-05-21 11:50:30 -0400160
Yury Selivanov66f88282015-06-24 11:04:15 -0400161 :term:`Coroutine` objects and instances of the
162 :class:`~collections.abc.Coroutine` ABC are all instances of this ABC.
Yury Selivanovf3e40fa2015-05-21 11:50:30 -0400163
Yury Selivanovcc1d0282015-07-01 12:49:00 -0400164 .. note::
Yury Selivanovfdbeb2b2015-07-03 13:11:35 -0400165 In CPython, generator-based coroutines (generators decorated with
166 :func:`types.coroutine` or :func:`asyncio.coroutine`) are
167 *awaitables*, even though they do not have an :meth:`__await__` method.
168 Using ``isinstance(gencoro, Awaitable)`` for them will return ``False``.
169 Use :func:`inspect.isawaitable` to detect them.
Yury Selivanovcc1d0282015-07-01 12:49:00 -0400170
Yury Selivanovf3e40fa2015-05-21 11:50:30 -0400171 .. versionadded:: 3.5
172
173.. class:: Coroutine
174
Yury Selivanov66f88282015-06-24 11:04:15 -0400175 ABC for coroutine compatible classes. These implement the
176 following methods, defined in :ref:`coroutine-objects`:
177 :meth:`~coroutine.send`, :meth:`~coroutine.throw`, and
178 :meth:`~coroutine.close`. Custom implementations must also implement
179 :meth:`__await__`. All :class:`Coroutine` instances are also instances of
Yury Selivanov56fc6142015-05-29 09:01:29 -0400180 :class:`Awaitable`. See also the definition of :term:`coroutine`.
Yury Selivanovf3e40fa2015-05-21 11:50:30 -0400181
Yury Selivanovcc1d0282015-07-01 12:49:00 -0400182 .. note::
Yury Selivanovfdbeb2b2015-07-03 13:11:35 -0400183 In CPython, generator-based coroutines (generators decorated with
184 :func:`types.coroutine` or :func:`asyncio.coroutine`) are
185 *awaitables*, even though they do not have an :meth:`__await__` method.
186 Using ``isinstance(gencoro, Coroutine)`` for them will return ``False``.
187 Use :func:`inspect.isawaitable` to detect them.
Yury Selivanovcc1d0282015-07-01 12:49:00 -0400188
Yury Selivanovf3e40fa2015-05-21 11:50:30 -0400189 .. versionadded:: 3.5
190
191.. class:: AsyncIterable
192
193 ABC for classes that provide ``__aiter__`` method. See also the
194 definition of :term:`asynchronous iterable`.
195
196 .. versionadded:: 3.5
197
198.. class:: AsyncIterator
199
200 ABC for classes that provide ``__aiter__`` and ``__anext__``
201 methods. See also the definition of :term:`asynchronous iterator`.
202
203 .. versionadded:: 3.5
204
Ezio Melottic831a912011-03-28 19:27:09 +0300205
Raymond Hettinger158c9c22011-02-22 00:41:50 +0000206These ABCs allow us to ask classes or instances if they provide
207particular functionality, for example::
208
209 size = None
Georg Brandl5f4b4ac2013-04-14 10:50:05 +0200210 if isinstance(myvar, collections.abc.Sized):
Raymond Hettinger158c9c22011-02-22 00:41:50 +0000211 size = len(myvar)
212
213Several of the ABCs are also useful as mixins that make it easier to develop
214classes supporting container APIs. For example, to write a class supporting
Georg Brandl8ed75cd2014-10-31 10:25:48 +0100215the full :class:`Set` API, it is only necessary to supply the three underlying
Raymond Hettinger158c9c22011-02-22 00:41:50 +0000216abstract methods: :meth:`__contains__`, :meth:`__iter__`, and :meth:`__len__`.
217The ABC supplies the remaining methods such as :meth:`__and__` and
Georg Brandl44ea77b2013-03-28 13:28:44 +0100218:meth:`isdisjoint`::
Raymond Hettinger158c9c22011-02-22 00:41:50 +0000219
Georg Brandl5f4b4ac2013-04-14 10:50:05 +0200220 class ListBasedSet(collections.abc.Set):
Raymond Hettinger158c9c22011-02-22 00:41:50 +0000221 ''' Alternate set implementation favoring space over speed
222 and not requiring the set elements to be hashable. '''
223 def __init__(self, iterable):
224 self.elements = lst = []
225 for value in iterable:
226 if value not in lst:
227 lst.append(value)
228 def __iter__(self):
229 return iter(self.elements)
230 def __contains__(self, value):
231 return value in self.elements
232 def __len__(self):
233 return len(self.elements)
234
235 s1 = ListBasedSet('abcdef')
236 s2 = ListBasedSet('defghi')
237 overlap = s1 & s2 # The __and__() method is supported automatically
238
239Notes on using :class:`Set` and :class:`MutableSet` as a mixin:
240
241(1)
242 Since some set operations create new sets, the default mixin methods need
243 a way to create new instances from an iterable. The class constructor is
244 assumed to have a signature in the form ``ClassName(iterable)``.
245 That assumption is factored-out to an internal classmethod called
246 :meth:`_from_iterable` which calls ``cls(iterable)`` to produce a new set.
247 If the :class:`Set` mixin is being used in a class with a different
Antoine Pitrou36920352011-03-22 18:33:33 +0100248 constructor signature, you will need to override :meth:`_from_iterable`
Raymond Hettinger158c9c22011-02-22 00:41:50 +0000249 with a classmethod that can construct new instances from
250 an iterable argument.
251
252(2)
253 To override the comparisons (presumably for speed, as the
Raymond Hettinger11cda472014-07-03 00:31:30 +0100254 semantics are fixed), redefine :meth:`__le__` and :meth:`__ge__`,
Raymond Hettinger158c9c22011-02-22 00:41:50 +0000255 then the other operations will automatically follow suit.
256
257(3)
258 The :class:`Set` mixin provides a :meth:`_hash` method to compute a hash value
259 for the set; however, :meth:`__hash__` is not defined because not all sets
Donald Stufft8b852f12014-05-20 12:58:38 -0400260 are hashable or immutable. To add set hashability using mixins,
Raymond Hettinger158c9c22011-02-22 00:41:50 +0000261 inherit from both :meth:`Set` and :meth:`Hashable`, then define
262 ``__hash__ = Set._hash``.
263
264.. seealso::
265
Éric Araujo459b4522011-06-04 21:16:42 +0200266 * `OrderedSet recipe <http://code.activestate.com/recipes/576694/>`_ for an
267 example built on :class:`MutableSet`.
Raymond Hettinger158c9c22011-02-22 00:41:50 +0000268
Éric Araujo459b4522011-06-04 21:16:42 +0200269 * For more about ABCs, see the :mod:`abc` module and :pep:`3119`.