blob: f035970a8e9ac170bdbc97a62d5fd886e444a50e [file] [log] [blame]
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001# Copyright 2007 Google, Inc. All Rights Reserved.
2# Licensed to PSF under a Contributor Agreement.
3
4"""Abstract Base Classes (ABCs) for collections, according to PEP 3119.
5
Raymond Hettinger158c9c22011-02-22 00:41:50 +00006Unit tests are in test_collections.
Guido van Rossumcd16bf62007-06-13 18:07:49 +00007"""
8
9from abc import ABCMeta, abstractmethod
Benjamin Peterson41181742008-07-02 20:22:54 +000010import sys
Guido van Rossumcd16bf62007-06-13 18:07:49 +000011
Yury Selivanove0104ae2015-05-14 12:19:16 -040012__all__ = ["Awaitable", "Coroutine", "AsyncIterable", "AsyncIterator",
Guido van Rossum16ca06b2016-04-04 10:59:29 -070013 "Hashable", "Iterable", "Iterator", "Generator", "Reversible",
Guido van Rossumf0666942016-08-23 10:47:07 -070014 "Sized", "Container", "Callable", "Collection",
Guido van Rossumcd16bf62007-06-13 18:07:49 +000015 "Set", "MutableSet",
16 "Mapping", "MutableMapping",
17 "MappingView", "KeysView", "ItemsView", "ValuesView",
18 "Sequence", "MutableSequence",
Guido van Rossumd05eb002007-11-21 22:26:24 +000019 "ByteString",
Guido van Rossumcd16bf62007-06-13 18:07:49 +000020 ]
21
Christian Heimesbf235bd2013-10-13 02:21:33 +020022# This module has been renamed from collections.abc to _collections_abc to
23# speed up interpreter startup. Some of the types such as MutableMapping are
24# required early but collections module imports a lot of other modules.
25# See issue #19218
26__name__ = "collections.abc"
27
Raymond Hettinger02184282012-04-05 13:31:12 -070028# Private list of types that we want to register with the various ABCs
29# so that they will pass tests like:
30# it = iter(somebytearray)
31# assert isinstance(it, Iterable)
32# Note: in other implementations, these types many not be distinct
33# and they make have their own implementation specific types that
34# are not included on this list.
Christian Heimesf83be4e2007-11-28 09:44:38 +000035bytes_iterator = type(iter(b''))
36bytearray_iterator = type(iter(bytearray()))
37#callable_iterator = ???
38dict_keyiterator = type(iter({}.keys()))
39dict_valueiterator = type(iter({}.values()))
40dict_itemiterator = type(iter({}.items()))
41list_iterator = type(iter([]))
42list_reverseiterator = type(iter(reversed([])))
43range_iterator = type(iter(range(0)))
44set_iterator = type(iter(set()))
45str_iterator = type(iter(""))
46tuple_iterator = type(iter(()))
47zip_iterator = type(iter(zip()))
48## views ##
49dict_keys = type({}.keys())
50dict_values = type({}.values())
51dict_items = type({}.items())
Christian Heimes0db38532007-11-29 16:21:13 +000052## misc ##
Victor Stinner7b17a4e2012-04-20 01:41:36 +020053mappingproxy = type(type.__dict__)
Raymond Hettingerbd60e8d2015-05-09 01:07:23 -040054generator = type((lambda: (yield))())
Yury Selivanov5376ba92015-06-22 12:19:30 -040055## coroutine ##
56async def _coro(): pass
57_coro = _coro()
58coroutine = type(_coro)
59_coro.close() # Prevent ResourceWarning
60del _coro
Christian Heimesf83be4e2007-11-28 09:44:38 +000061
62
Guido van Rossumcd16bf62007-06-13 18:07:49 +000063### ONE-TRICK PONIES ###
64
Guido van Rossum97c1adf2016-08-18 09:22:23 -070065def _check_methods(C, *methods):
66 mro = C.__mro__
67 for method in methods:
68 for B in mro:
69 if method in B.__dict__:
70 if B.__dict__[method] is None:
71 return NotImplemented
72 break
73 else:
74 return NotImplemented
75 return True
76
Guido van Rossumcd16bf62007-06-13 18:07:49 +000077class Hashable(metaclass=ABCMeta):
78
Raymond Hettingerc46759a2011-03-22 11:46:25 -070079 __slots__ = ()
80
Guido van Rossumcd16bf62007-06-13 18:07:49 +000081 @abstractmethod
82 def __hash__(self):
83 return 0
84
85 @classmethod
86 def __subclasshook__(cls, C):
87 if cls is Hashable:
Guido van Rossum97c1adf2016-08-18 09:22:23 -070088 return _check_methods(C, "__hash__")
Guido van Rossumcd16bf62007-06-13 18:07:49 +000089 return NotImplemented
90
91
Yury Selivanovfdbeb2b2015-07-03 13:11:35 -040092class Awaitable(metaclass=ABCMeta):
Yury Selivanov56fc6142015-05-29 09:01:29 -040093
94 __slots__ = ()
95
96 @abstractmethod
97 def __await__(self):
98 yield
99
100 @classmethod
101 def __subclasshook__(cls, C):
102 if cls is Awaitable:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700103 return _check_methods(C, "__await__")
Yury Selivanov56fc6142015-05-29 09:01:29 -0400104 return NotImplemented
105
106
107class Coroutine(Awaitable):
Yury Selivanov75445082015-05-11 22:57:16 -0400108
109 __slots__ = ()
110
111 @abstractmethod
112 def send(self, value):
113 """Send a value into the coroutine.
114 Return next yielded value or raise StopIteration.
115 """
116 raise StopIteration
117
118 @abstractmethod
119 def throw(self, typ, val=None, tb=None):
120 """Raise an exception in the coroutine.
121 Return next yielded value or raise StopIteration.
122 """
123 if val is None:
124 if tb is None:
125 raise typ
126 val = typ()
127 if tb is not None:
128 val = val.with_traceback(tb)
129 raise val
130
131 def close(self):
132 """Raise GeneratorExit inside coroutine.
133 """
134 try:
135 self.throw(GeneratorExit)
136 except (GeneratorExit, StopIteration):
137 pass
138 else:
139 raise RuntimeError("coroutine ignored GeneratorExit")
140
Yury Selivanov75445082015-05-11 22:57:16 -0400141 @classmethod
142 def __subclasshook__(cls, C):
Yury Selivanov56fc6142015-05-29 09:01:29 -0400143 if cls is Coroutine:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700144 return _check_methods(C, '__await__', 'send', 'throw', 'close')
Yury Selivanov75445082015-05-11 22:57:16 -0400145 return NotImplemented
146
Yury Selivanov75445082015-05-11 22:57:16 -0400147
Yury Selivanov5376ba92015-06-22 12:19:30 -0400148Coroutine.register(coroutine)
149
150
Yury Selivanove0104ae2015-05-14 12:19:16 -0400151class AsyncIterable(metaclass=ABCMeta):
152
153 __slots__ = ()
154
155 @abstractmethod
Yury Selivanova6f6edb2016-06-09 15:08:31 -0400156 def __aiter__(self):
Yury Selivanove0104ae2015-05-14 12:19:16 -0400157 return AsyncIterator()
158
159 @classmethod
160 def __subclasshook__(cls, C):
161 if cls is AsyncIterable:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700162 return _check_methods(C, "__aiter__")
Yury Selivanove0104ae2015-05-14 12:19:16 -0400163 return NotImplemented
164
165
166class AsyncIterator(AsyncIterable):
167
168 __slots__ = ()
169
170 @abstractmethod
171 async def __anext__(self):
172 """Return the next item or raise StopAsyncIteration when exhausted."""
173 raise StopAsyncIteration
174
Yury Selivanova6f6edb2016-06-09 15:08:31 -0400175 def __aiter__(self):
Yury Selivanove0104ae2015-05-14 12:19:16 -0400176 return self
177
178 @classmethod
179 def __subclasshook__(cls, C):
180 if cls is AsyncIterator:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700181 return _check_methods(C, "__anext__", "__aiter__")
Yury Selivanove0104ae2015-05-14 12:19:16 -0400182 return NotImplemented
183
184
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000185class Iterable(metaclass=ABCMeta):
186
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700187 __slots__ = ()
188
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000189 @abstractmethod
190 def __iter__(self):
191 while False:
192 yield None
193
194 @classmethod
195 def __subclasshook__(cls, C):
196 if cls is Iterable:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700197 return _check_methods(C, "__iter__")
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000198 return NotImplemented
199
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000200
Raymond Hettinger74b64952008-02-09 02:53:48 +0000201class Iterator(Iterable):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000202
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700203 __slots__ = ()
204
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000205 @abstractmethod
206 def __next__(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700207 'Return the next item from the iterator. When exhausted, raise StopIteration'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000208 raise StopIteration
209
210 def __iter__(self):
211 return self
212
213 @classmethod
214 def __subclasshook__(cls, C):
215 if cls is Iterator:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700216 return _check_methods(C, '__iter__', '__next__')
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000217 return NotImplemented
218
Christian Heimesf83be4e2007-11-28 09:44:38 +0000219Iterator.register(bytes_iterator)
220Iterator.register(bytearray_iterator)
221#Iterator.register(callable_iterator)
222Iterator.register(dict_keyiterator)
223Iterator.register(dict_valueiterator)
224Iterator.register(dict_itemiterator)
225Iterator.register(list_iterator)
226Iterator.register(list_reverseiterator)
227Iterator.register(range_iterator)
228Iterator.register(set_iterator)
229Iterator.register(str_iterator)
230Iterator.register(tuple_iterator)
231Iterator.register(zip_iterator)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000232
Raymond Hettingerbd60e8d2015-05-09 01:07:23 -0400233
Guido van Rossum16ca06b2016-04-04 10:59:29 -0700234class Reversible(Iterable):
235
236 __slots__ = ()
237
238 @abstractmethod
239 def __reversed__(self):
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700240 while False:
241 yield None
Guido van Rossum16ca06b2016-04-04 10:59:29 -0700242
243 @classmethod
244 def __subclasshook__(cls, C):
245 if cls is Reversible:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700246 return _check_methods(C, "__reversed__", "__iter__")
Guido van Rossum16ca06b2016-04-04 10:59:29 -0700247 return NotImplemented
248
249
Raymond Hettingerbd60e8d2015-05-09 01:07:23 -0400250class Generator(Iterator):
251
252 __slots__ = ()
253
254 def __next__(self):
255 """Return the next item from the generator.
256 When exhausted, raise StopIteration.
257 """
258 return self.send(None)
259
260 @abstractmethod
261 def send(self, value):
262 """Send a value into the generator.
263 Return next yielded value or raise StopIteration.
264 """
265 raise StopIteration
266
267 @abstractmethod
268 def throw(self, typ, val=None, tb=None):
269 """Raise an exception in the generator.
270 Return next yielded value or raise StopIteration.
271 """
272 if val is None:
273 if tb is None:
274 raise typ
275 val = typ()
276 if tb is not None:
277 val = val.with_traceback(tb)
278 raise val
279
280 def close(self):
281 """Raise GeneratorExit inside generator.
282 """
283 try:
284 self.throw(GeneratorExit)
285 except (GeneratorExit, StopIteration):
286 pass
287 else:
288 raise RuntimeError("generator ignored GeneratorExit")
289
290 @classmethod
291 def __subclasshook__(cls, C):
292 if cls is Generator:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700293 return _check_methods(C, '__iter__', '__next__',
294 'send', 'throw', 'close')
Raymond Hettingerbd60e8d2015-05-09 01:07:23 -0400295 return NotImplemented
296
Raymond Hettingerbd60e8d2015-05-09 01:07:23 -0400297Generator.register(generator)
298
299
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000300class Sized(metaclass=ABCMeta):
301
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700302 __slots__ = ()
303
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000304 @abstractmethod
305 def __len__(self):
306 return 0
307
308 @classmethod
309 def __subclasshook__(cls, C):
310 if cls is Sized:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700311 return _check_methods(C, "__len__")
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000312 return NotImplemented
313
314
315class Container(metaclass=ABCMeta):
316
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700317 __slots__ = ()
318
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000319 @abstractmethod
320 def __contains__(self, x):
321 return False
322
323 @classmethod
324 def __subclasshook__(cls, C):
325 if cls is Container:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700326 return _check_methods(C, "__contains__")
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000327 return NotImplemented
328
Guido van Rossumf0666942016-08-23 10:47:07 -0700329class Collection(Sized, Iterable, Container):
330
331 __slots__ = ()
332
333 @classmethod
334 def __subclasshook__(cls, C):
335 if cls is Collection:
336 return _check_methods(C, "__len__", "__iter__", "__contains__")
337 return NotImplemented
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000338
339class Callable(metaclass=ABCMeta):
340
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700341 __slots__ = ()
342
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000343 @abstractmethod
Christian Heimes78644762008-03-04 23:39:23 +0000344 def __call__(self, *args, **kwds):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000345 return False
346
347 @classmethod
348 def __subclasshook__(cls, C):
349 if cls is Callable:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700350 return _check_methods(C, "__call__")
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000351 return NotImplemented
352
353
354### SETS ###
355
356
Guido van Rossumf0666942016-08-23 10:47:07 -0700357class Set(Collection):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000358
359 """A set is a finite, iterable container.
360
361 This class provides concrete generic implementations of all
362 methods except for __contains__, __iter__ and __len__.
363
364 To override the comparisons (presumably for speed, as the
Raymond Hettinger11cda472014-07-03 00:31:30 +0100365 semantics are fixed), redefine __le__ and __ge__,
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000366 then the other operations will automatically follow suit.
367 """
368
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700369 __slots__ = ()
370
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000371 def __le__(self, other):
372 if not isinstance(other, Set):
373 return NotImplemented
374 if len(self) > len(other):
375 return False
376 for elem in self:
377 if elem not in other:
378 return False
379 return True
380
381 def __lt__(self, other):
382 if not isinstance(other, Set):
383 return NotImplemented
384 return len(self) < len(other) and self.__le__(other)
385
Raymond Hettinger71909422008-02-09 00:08:16 +0000386 def __gt__(self, other):
387 if not isinstance(other, Set):
388 return NotImplemented
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700389 return len(self) > len(other) and self.__ge__(other)
Raymond Hettinger71909422008-02-09 00:08:16 +0000390
391 def __ge__(self, other):
392 if not isinstance(other, Set):
393 return NotImplemented
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700394 if len(self) < len(other):
395 return False
396 for elem in other:
397 if elem not in self:
398 return False
399 return True
Raymond Hettinger71909422008-02-09 00:08:16 +0000400
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000401 def __eq__(self, other):
402 if not isinstance(other, Set):
403 return NotImplemented
404 return len(self) == len(other) and self.__le__(other)
405
406 @classmethod
407 def _from_iterable(cls, it):
Raymond Hettinger8284c4a2008-02-06 20:47:09 +0000408 '''Construct an instance of the class from any iterable input.
409
410 Must override this method if the class constructor signature
Raymond Hettinger7aebb642008-02-09 03:25:08 +0000411 does not accept an iterable for an input.
Raymond Hettinger8284c4a2008-02-06 20:47:09 +0000412 '''
Raymond Hettinger7aebb642008-02-09 03:25:08 +0000413 return cls(it)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000414
415 def __and__(self, other):
416 if not isinstance(other, Iterable):
417 return NotImplemented
418 return self._from_iterable(value for value in other if value in self)
419
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700420 __rand__ = __and__
421
Christian Heimes190d79e2008-01-30 11:58:22 +0000422 def isdisjoint(self, other):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700423 'Return True if two sets have a null intersection.'
Christian Heimes190d79e2008-01-30 11:58:22 +0000424 for value in other:
425 if value in self:
426 return False
427 return True
428
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000429 def __or__(self, other):
430 if not isinstance(other, Iterable):
431 return NotImplemented
Christian Heimes78644762008-03-04 23:39:23 +0000432 chain = (e for s in (self, other) for e in s)
433 return self._from_iterable(chain)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000434
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700435 __ror__ = __or__
436
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000437 def __sub__(self, other):
438 if not isinstance(other, Set):
439 if not isinstance(other, Iterable):
440 return NotImplemented
441 other = self._from_iterable(other)
442 return self._from_iterable(value for value in self
443 if value not in other)
444
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700445 def __rsub__(self, other):
446 if not isinstance(other, Set):
447 if not isinstance(other, Iterable):
448 return NotImplemented
449 other = self._from_iterable(other)
450 return self._from_iterable(value for value in other
451 if value not in self)
452
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000453 def __xor__(self, other):
454 if not isinstance(other, Set):
455 if not isinstance(other, Iterable):
456 return NotImplemented
457 other = self._from_iterable(other)
458 return (self - other) | (other - self)
459
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700460 __rxor__ = __xor__
461
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000462 def _hash(self):
463 """Compute the hash value of a set.
464
465 Note that we don't define __hash__: not all sets are hashable.
466 But if you define a hashable set type, its __hash__ should
467 call this function.
468
469 This must be compatible __eq__.
470
471 All sets ought to compare equal if they contain the same
472 elements, regardless of how they are implemented, and
473 regardless of the order of the elements; so there's not much
474 freedom for __eq__ or __hash__. We match the algorithm used
475 by the built-in frozenset type.
476 """
Christian Heimesa37d4c62007-12-04 23:02:19 +0000477 MAX = sys.maxsize
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000478 MASK = 2 * MAX + 1
479 n = len(self)
480 h = 1927868237 * (n + 1)
481 h &= MASK
482 for x in self:
483 hx = hash(x)
484 h ^= (hx ^ (hx << 16) ^ 89869747) * 3644798167
485 h &= MASK
486 h = h * 69069 + 907133923
487 h &= MASK
488 if h > MAX:
489 h -= MASK + 1
490 if h == -1:
491 h = 590923713
492 return h
493
494Set.register(frozenset)
495
496
497class MutableSet(Set):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700498 """A mutable set is a finite, iterable container.
499
500 This class provides concrete generic implementations of all
501 methods except for __contains__, __iter__, __len__,
502 add(), and discard().
503
504 To override the comparisons (presumably for speed, as the
505 semantics are fixed), all you have to do is redefine __le__ and
506 then the other operations will automatically follow suit.
507 """
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000508
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700509 __slots__ = ()
510
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000511 @abstractmethod
512 def add(self, value):
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000513 """Add an element."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000514 raise NotImplementedError
515
516 @abstractmethod
517 def discard(self, value):
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000518 """Remove an element. Do not raise an exception if absent."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000519 raise NotImplementedError
520
Christian Heimes190d79e2008-01-30 11:58:22 +0000521 def remove(self, value):
522 """Remove an element. If not a member, raise a KeyError."""
523 if value not in self:
524 raise KeyError(value)
525 self.discard(value)
526
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000527 def pop(self):
528 """Return the popped value. Raise KeyError if empty."""
529 it = iter(self)
530 try:
Raymond Hettingerae650182009-01-28 23:33:59 +0000531 value = next(it)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000532 except StopIteration:
533 raise KeyError
534 self.discard(value)
535 return value
536
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000537 def clear(self):
538 """This is slow (creates N new iterators!) but effective."""
539 try:
540 while True:
541 self.pop()
542 except KeyError:
543 pass
544
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000545 def __ior__(self, it):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000546 for value in it:
547 self.add(value)
548 return self
549
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000550 def __iand__(self, it):
Raymond Hettinger3f10a952009-04-01 19:05:50 +0000551 for value in (self - it):
552 self.discard(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000553 return self
554
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000555 def __ixor__(self, it):
Daniel Stutzbach31da5b22010-08-24 20:49:57 +0000556 if it is self:
557 self.clear()
558 else:
559 if not isinstance(it, Set):
560 it = self._from_iterable(it)
561 for value in it:
562 if value in self:
563 self.discard(value)
564 else:
565 self.add(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000566 return self
567
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000568 def __isub__(self, it):
Daniel Stutzbach31da5b22010-08-24 20:49:57 +0000569 if it is self:
570 self.clear()
571 else:
572 for value in it:
573 self.discard(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000574 return self
575
576MutableSet.register(set)
577
578
579### MAPPINGS ###
580
581
Guido van Rossumf0666942016-08-23 10:47:07 -0700582class Mapping(Collection):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000583
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700584 __slots__ = ()
585
Raymond Hettinger153866e2013-03-24 15:20:29 -0700586 """A Mapping is a generic container for associating key/value
587 pairs.
588
589 This class provides concrete generic implementations of all
590 methods except for __getitem__, __iter__, and __len__.
591
592 """
593
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000594 @abstractmethod
595 def __getitem__(self, key):
596 raise KeyError
597
598 def get(self, key, default=None):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700599 'D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000600 try:
601 return self[key]
602 except KeyError:
603 return default
604
605 def __contains__(self, key):
606 try:
607 self[key]
608 except KeyError:
609 return False
610 else:
611 return True
612
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000613 def keys(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700614 "D.keys() -> a set-like object providing a view on D's keys"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000615 return KeysView(self)
616
617 def items(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700618 "D.items() -> a set-like object providing a view on D's items"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000619 return ItemsView(self)
620
621 def values(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700622 "D.values() -> an object providing a view on D's values"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000623 return ValuesView(self)
624
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000625 def __eq__(self, other):
Benjamin Peterson4ad6bd52010-05-21 20:55:22 +0000626 if not isinstance(other, Mapping):
627 return NotImplemented
628 return dict(self.items()) == dict(other.items())
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000629
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700630 __reversed__ = None
631
Victor Stinner7b17a4e2012-04-20 01:41:36 +0200632Mapping.register(mappingproxy)
633
Christian Heimes2202f872008-02-06 14:31:34 +0000634
Raymond Hettingerbfd06122008-02-09 10:04:32 +0000635class MappingView(Sized):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000636
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700637 __slots__ = '_mapping',
638
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000639 def __init__(self, mapping):
640 self._mapping = mapping
641
642 def __len__(self):
643 return len(self._mapping)
644
Raymond Hettinger89fc2b72009-02-27 07:47:32 +0000645 def __repr__(self):
646 return '{0.__class__.__name__}({0._mapping!r})'.format(self)
647
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000648
649class KeysView(MappingView, Set):
650
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700651 __slots__ = ()
652
Raymond Hettinger9117c752010-08-22 07:44:24 +0000653 @classmethod
654 def _from_iterable(self, it):
655 return set(it)
656
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000657 def __contains__(self, key):
658 return key in self._mapping
659
660 def __iter__(self):
Philip Jenvey4993cc02012-10-01 12:53:43 -0700661 yield from self._mapping
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000662
Christian Heimesf83be4e2007-11-28 09:44:38 +0000663KeysView.register(dict_keys)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000664
665
666class ItemsView(MappingView, Set):
667
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700668 __slots__ = ()
669
Raymond Hettinger9117c752010-08-22 07:44:24 +0000670 @classmethod
671 def _from_iterable(self, it):
672 return set(it)
673
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000674 def __contains__(self, item):
675 key, value = item
676 try:
677 v = self._mapping[key]
678 except KeyError:
679 return False
680 else:
Raymond Hettinger584e8ae2016-05-05 11:14:06 +0300681 return v is value or v == value
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000682
683 def __iter__(self):
684 for key in self._mapping:
685 yield (key, self._mapping[key])
686
Christian Heimesf83be4e2007-11-28 09:44:38 +0000687ItemsView.register(dict_items)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000688
689
690class ValuesView(MappingView):
691
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700692 __slots__ = ()
693
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000694 def __contains__(self, value):
695 for key in self._mapping:
Raymond Hettinger584e8ae2016-05-05 11:14:06 +0300696 v = self._mapping[key]
697 if v is value or v == value:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000698 return True
699 return False
700
701 def __iter__(self):
702 for key in self._mapping:
703 yield self._mapping[key]
704
Christian Heimesf83be4e2007-11-28 09:44:38 +0000705ValuesView.register(dict_values)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000706
707
708class MutableMapping(Mapping):
709
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700710 __slots__ = ()
711
Raymond Hettinger153866e2013-03-24 15:20:29 -0700712 """A MutableMapping is a generic container for associating
713 key/value pairs.
714
715 This class provides concrete generic implementations of all
716 methods except for __getitem__, __setitem__, __delitem__,
717 __iter__, and __len__.
718
719 """
720
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000721 @abstractmethod
722 def __setitem__(self, key, value):
723 raise KeyError
724
725 @abstractmethod
726 def __delitem__(self, key):
727 raise KeyError
728
729 __marker = object()
730
731 def pop(self, key, default=__marker):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700732 '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
733 If key is not found, d is returned if given, otherwise KeyError is raised.
734 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000735 try:
736 value = self[key]
737 except KeyError:
738 if default is self.__marker:
739 raise
740 return default
741 else:
742 del self[key]
743 return value
744
745 def popitem(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700746 '''D.popitem() -> (k, v), remove and return some (key, value) pair
747 as a 2-tuple; but raise KeyError if D is empty.
748 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000749 try:
750 key = next(iter(self))
751 except StopIteration:
752 raise KeyError
753 value = self[key]
754 del self[key]
755 return key, value
756
757 def clear(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700758 'D.clear() -> None. Remove all items from D.'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000759 try:
760 while True:
761 self.popitem()
762 except KeyError:
763 pass
764
Mark Dickinsonb214e902010-07-11 18:53:06 +0000765 def update(*args, **kwds):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700766 ''' D.update([E, ]**F) -> None. Update D from mapping/iterable E and F.
767 If E present and has a .keys() method, does: for k in E: D[k] = E[k]
768 If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v
769 In either case, this is followed by: for k, v in F.items(): D[k] = v
770 '''
Serhiy Storchakaae5cb212014-11-27 16:25:51 +0200771 if not args:
772 raise TypeError("descriptor 'update' of 'MutableMapping' object "
773 "needs an argument")
774 self, *args = args
775 if len(args) > 1:
776 raise TypeError('update expected at most 1 arguments, got %d' %
777 len(args))
778 if args:
779 other = args[0]
780 if isinstance(other, Mapping):
781 for key in other:
782 self[key] = other[key]
783 elif hasattr(other, "keys"):
784 for key in other.keys():
785 self[key] = other[key]
786 else:
787 for key, value in other:
788 self[key] = value
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000789 for key, value in kwds.items():
790 self[key] = value
791
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000792 def setdefault(self, key, default=None):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700793 'D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D'
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000794 try:
795 return self[key]
796 except KeyError:
797 self[key] = default
798 return default
799
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000800MutableMapping.register(dict)
801
802
803### SEQUENCES ###
804
805
Guido van Rossumf0666942016-08-23 10:47:07 -0700806class Sequence(Reversible, Collection):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000807
808 """All the operations on a read-only sequence.
809
810 Concrete subclasses must override __new__ or __init__,
811 __getitem__, and __len__.
812 """
813
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700814 __slots__ = ()
815
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000816 @abstractmethod
817 def __getitem__(self, index):
818 raise IndexError
819
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000820 def __iter__(self):
821 i = 0
Raymond Hettinger71909422008-02-09 00:08:16 +0000822 try:
823 while True:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000824 v = self[i]
Raymond Hettinger71909422008-02-09 00:08:16 +0000825 yield v
826 i += 1
827 except IndexError:
828 return
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000829
830 def __contains__(self, value):
831 for v in self:
Raymond Hettinger584e8ae2016-05-05 11:14:06 +0300832 if v is value or v == value:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000833 return True
834 return False
835
836 def __reversed__(self):
837 for i in reversed(range(len(self))):
838 yield self[i]
839
Raymond Hettingerec219ba2015-05-22 19:29:22 -0700840 def index(self, value, start=0, stop=None):
841 '''S.index(value, [start, [stop]]) -> integer -- return first index of value.
Raymond Hettinger153866e2013-03-24 15:20:29 -0700842 Raises ValueError if the value is not present.
843 '''
Raymond Hettingerec219ba2015-05-22 19:29:22 -0700844 if start is not None and start < 0:
845 start = max(len(self) + start, 0)
846 if stop is not None and stop < 0:
847 stop += len(self)
848
849 i = start
850 while stop is None or i < stop:
851 try:
852 if self[i] == value:
853 return i
854 except IndexError:
855 break
856 i += 1
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000857 raise ValueError
858
859 def count(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700860 'S.count(value) -> integer -- return number of occurrences of value'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000861 return sum(1 for v in self if v == value)
862
863Sequence.register(tuple)
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000864Sequence.register(str)
Raymond Hettinger9aa53c22009-02-24 11:25:35 +0000865Sequence.register(range)
Nick Coghlan45163cc2013-10-02 22:31:47 +1000866Sequence.register(memoryview)
Guido van Rossumd05eb002007-11-21 22:26:24 +0000867
868
869class ByteString(Sequence):
870
871 """This unifies bytes and bytearray.
872
873 XXX Should add all their methods.
874 """
875
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700876 __slots__ = ()
877
Guido van Rossumd05eb002007-11-21 22:26:24 +0000878ByteString.register(bytes)
879ByteString.register(bytearray)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000880
881
882class MutableSequence(Sequence):
883
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700884 __slots__ = ()
885
Guido van Rossum840c3102013-07-25 11:55:41 -0700886 """All the operations on a read-write sequence.
Raymond Hettinger153866e2013-03-24 15:20:29 -0700887
888 Concrete subclasses must provide __new__ or __init__,
889 __getitem__, __setitem__, __delitem__, __len__, and insert().
890
891 """
892
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000893 @abstractmethod
894 def __setitem__(self, index, value):
895 raise IndexError
896
897 @abstractmethod
898 def __delitem__(self, index):
899 raise IndexError
900
901 @abstractmethod
902 def insert(self, index, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700903 'S.insert(index, value) -- insert value before index'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000904 raise IndexError
905
906 def append(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700907 'S.append(value) -- append value to the end of the sequence'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000908 self.insert(len(self), value)
909
Eli Bendersky9479d1a2011-03-04 05:34:58 +0000910 def clear(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700911 'S.clear() -> None -- remove all items from S'
Eli Bendersky9479d1a2011-03-04 05:34:58 +0000912 try:
913 while True:
914 self.pop()
915 except IndexError:
916 pass
917
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000918 def reverse(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700919 'S.reverse() -- reverse *IN PLACE*'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000920 n = len(self)
921 for i in range(n//2):
922 self[i], self[n-i-1] = self[n-i-1], self[i]
923
924 def extend(self, values):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700925 'S.extend(iterable) -- extend sequence by appending elements from the iterable'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000926 for v in values:
927 self.append(v)
928
929 def pop(self, index=-1):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700930 '''S.pop([index]) -> item -- remove and return item at index (default last).
931 Raise IndexError if list is empty or index is out of range.
932 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000933 v = self[index]
934 del self[index]
935 return v
936
937 def remove(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700938 '''S.remove(value) -- remove first occurrence of value.
939 Raise ValueError if the value is not present.
940 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000941 del self[self.index(value)]
942
943 def __iadd__(self, values):
944 self.extend(values)
Raymond Hettingerc384b222009-05-18 15:35:26 +0000945 return self
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000946
947MutableSequence.register(list)
Guido van Rossumd05eb002007-11-21 22:26:24 +0000948MutableSequence.register(bytearray) # Multiply inheriting, see ByteString