blob: b172f3f360e6ef5c98b69c187caa33a28b1f56fb [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 Selivanov22214ab2016-11-16 18:25:04 -050012__all__ = ["Awaitable", "Coroutine",
13 "AsyncIterable", "AsyncIterator", "AsyncGenerator",
Guido van Rossum16ca06b2016-04-04 10:59:29 -070014 "Hashable", "Iterable", "Iterator", "Generator", "Reversible",
Guido van Rossumf0666942016-08-23 10:47:07 -070015 "Sized", "Container", "Callable", "Collection",
Guido van Rossumcd16bf62007-06-13 18:07:49 +000016 "Set", "MutableSet",
17 "Mapping", "MutableMapping",
18 "MappingView", "KeysView", "ItemsView", "ValuesView",
19 "Sequence", "MutableSequence",
Guido van Rossumd05eb002007-11-21 22:26:24 +000020 "ByteString",
Guido van Rossumcd16bf62007-06-13 18:07:49 +000021 ]
22
Christian Heimesbf235bd2013-10-13 02:21:33 +020023# This module has been renamed from collections.abc to _collections_abc to
24# speed up interpreter startup. Some of the types such as MutableMapping are
25# required early but collections module imports a lot of other modules.
26# See issue #19218
27__name__ = "collections.abc"
28
Raymond Hettinger02184282012-04-05 13:31:12 -070029# Private list of types that we want to register with the various ABCs
30# so that they will pass tests like:
31# it = iter(somebytearray)
32# assert isinstance(it, Iterable)
Serhiy Storchaka3bd9fde2016-10-08 21:33:59 +030033# Note: in other implementations, these types might not be distinct
34# and they may have their own implementation specific types that
Raymond Hettinger02184282012-04-05 13:31:12 -070035# are not included on this list.
Christian Heimesf83be4e2007-11-28 09:44:38 +000036bytes_iterator = type(iter(b''))
37bytearray_iterator = type(iter(bytearray()))
38#callable_iterator = ???
39dict_keyiterator = type(iter({}.keys()))
40dict_valueiterator = type(iter({}.values()))
41dict_itemiterator = type(iter({}.items()))
42list_iterator = type(iter([]))
43list_reverseiterator = type(iter(reversed([])))
44range_iterator = type(iter(range(0)))
Serhiy Storchaka48b1c3f2016-10-08 22:04:12 +030045longrange_iterator = type(iter(range(1 << 1000)))
Christian Heimesf83be4e2007-11-28 09:44:38 +000046set_iterator = type(iter(set()))
47str_iterator = type(iter(""))
48tuple_iterator = type(iter(()))
49zip_iterator = type(iter(zip()))
50## views ##
51dict_keys = type({}.keys())
52dict_values = type({}.values())
53dict_items = type({}.items())
Christian Heimes0db38532007-11-29 16:21:13 +000054## misc ##
Victor Stinner7b17a4e2012-04-20 01:41:36 +020055mappingproxy = type(type.__dict__)
Raymond Hettingerbd60e8d2015-05-09 01:07:23 -040056generator = type((lambda: (yield))())
Yury Selivanov5376ba92015-06-22 12:19:30 -040057## coroutine ##
58async def _coro(): pass
59_coro = _coro()
60coroutine = type(_coro)
61_coro.close() # Prevent ResourceWarning
62del _coro
Yury Selivanov22214ab2016-11-16 18:25:04 -050063## asynchronous generator ##
64async def _ag(): yield
65_ag = _ag()
66async_generator = type(_ag)
67del _ag
Christian Heimesf83be4e2007-11-28 09:44:38 +000068
69
Guido van Rossumcd16bf62007-06-13 18:07:49 +000070### ONE-TRICK PONIES ###
71
Guido van Rossum97c1adf2016-08-18 09:22:23 -070072def _check_methods(C, *methods):
73 mro = C.__mro__
74 for method in methods:
75 for B in mro:
76 if method in B.__dict__:
77 if B.__dict__[method] is None:
78 return NotImplemented
79 break
80 else:
81 return NotImplemented
82 return True
83
Guido van Rossumcd16bf62007-06-13 18:07:49 +000084class Hashable(metaclass=ABCMeta):
85
Raymond Hettingerc46759a2011-03-22 11:46:25 -070086 __slots__ = ()
87
Guido van Rossumcd16bf62007-06-13 18:07:49 +000088 @abstractmethod
89 def __hash__(self):
90 return 0
91
92 @classmethod
93 def __subclasshook__(cls, C):
94 if cls is Hashable:
Guido van Rossum97c1adf2016-08-18 09:22:23 -070095 return _check_methods(C, "__hash__")
Guido van Rossumcd16bf62007-06-13 18:07:49 +000096 return NotImplemented
97
98
Yury Selivanovfdbeb2b2015-07-03 13:11:35 -040099class Awaitable(metaclass=ABCMeta):
Yury Selivanov56fc6142015-05-29 09:01:29 -0400100
101 __slots__ = ()
102
103 @abstractmethod
104 def __await__(self):
105 yield
106
107 @classmethod
108 def __subclasshook__(cls, C):
109 if cls is Awaitable:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700110 return _check_methods(C, "__await__")
Yury Selivanov56fc6142015-05-29 09:01:29 -0400111 return NotImplemented
112
113
114class Coroutine(Awaitable):
Yury Selivanov75445082015-05-11 22:57:16 -0400115
116 __slots__ = ()
117
118 @abstractmethod
119 def send(self, value):
120 """Send a value into the coroutine.
121 Return next yielded value or raise StopIteration.
122 """
123 raise StopIteration
124
125 @abstractmethod
126 def throw(self, typ, val=None, tb=None):
127 """Raise an exception in the coroutine.
128 Return next yielded value or raise StopIteration.
129 """
130 if val is None:
131 if tb is None:
132 raise typ
133 val = typ()
134 if tb is not None:
135 val = val.with_traceback(tb)
136 raise val
137
138 def close(self):
139 """Raise GeneratorExit inside coroutine.
140 """
141 try:
142 self.throw(GeneratorExit)
143 except (GeneratorExit, StopIteration):
144 pass
145 else:
146 raise RuntimeError("coroutine ignored GeneratorExit")
147
Yury Selivanov75445082015-05-11 22:57:16 -0400148 @classmethod
149 def __subclasshook__(cls, C):
Yury Selivanov56fc6142015-05-29 09:01:29 -0400150 if cls is Coroutine:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700151 return _check_methods(C, '__await__', 'send', 'throw', 'close')
Yury Selivanov75445082015-05-11 22:57:16 -0400152 return NotImplemented
153
Yury Selivanov75445082015-05-11 22:57:16 -0400154
Yury Selivanov5376ba92015-06-22 12:19:30 -0400155Coroutine.register(coroutine)
156
157
Yury Selivanove0104ae2015-05-14 12:19:16 -0400158class AsyncIterable(metaclass=ABCMeta):
159
160 __slots__ = ()
161
162 @abstractmethod
Yury Selivanova6f6edb2016-06-09 15:08:31 -0400163 def __aiter__(self):
Yury Selivanove0104ae2015-05-14 12:19:16 -0400164 return AsyncIterator()
165
166 @classmethod
167 def __subclasshook__(cls, C):
168 if cls is AsyncIterable:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700169 return _check_methods(C, "__aiter__")
Yury Selivanove0104ae2015-05-14 12:19:16 -0400170 return NotImplemented
171
172
173class AsyncIterator(AsyncIterable):
174
175 __slots__ = ()
176
177 @abstractmethod
178 async def __anext__(self):
179 """Return the next item or raise StopAsyncIteration when exhausted."""
180 raise StopAsyncIteration
181
Yury Selivanova6f6edb2016-06-09 15:08:31 -0400182 def __aiter__(self):
Yury Selivanove0104ae2015-05-14 12:19:16 -0400183 return self
184
185 @classmethod
186 def __subclasshook__(cls, C):
187 if cls is AsyncIterator:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700188 return _check_methods(C, "__anext__", "__aiter__")
Yury Selivanove0104ae2015-05-14 12:19:16 -0400189 return NotImplemented
190
191
Yury Selivanov22214ab2016-11-16 18:25:04 -0500192class AsyncGenerator(AsyncIterator):
193
194 __slots__ = ()
195
196 async def __anext__(self):
197 """Return the next item from the asynchronous generator.
198 When exhausted, raise StopAsyncIteration.
199 """
200 return await self.asend(None)
201
202 @abstractmethod
203 async def asend(self, value):
204 """Send a value into the asynchronous generator.
205 Return next yielded value or raise StopAsyncIteration.
206 """
207 raise StopAsyncIteration
208
209 @abstractmethod
210 async def athrow(self, typ, val=None, tb=None):
211 """Raise an exception in the asynchronous generator.
212 Return next yielded value or raise StopAsyncIteration.
213 """
214 if val is None:
215 if tb is None:
216 raise typ
217 val = typ()
218 if tb is not None:
219 val = val.with_traceback(tb)
220 raise val
221
222 async def aclose(self):
223 """Raise GeneratorExit inside coroutine.
224 """
225 try:
226 await self.athrow(GeneratorExit)
227 except (GeneratorExit, StopAsyncIteration):
228 pass
229 else:
230 raise RuntimeError("asynchronous generator ignored GeneratorExit")
231
232 @classmethod
233 def __subclasshook__(cls, C):
234 if cls is AsyncGenerator:
235 return _check_methods(C, '__aiter__', '__anext__',
236 'asend', 'athrow', 'aclose')
237 return NotImplemented
238
239
240AsyncGenerator.register(async_generator)
241
242
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000243class Iterable(metaclass=ABCMeta):
244
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700245 __slots__ = ()
246
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000247 @abstractmethod
248 def __iter__(self):
249 while False:
250 yield None
251
252 @classmethod
253 def __subclasshook__(cls, C):
254 if cls is Iterable:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700255 return _check_methods(C, "__iter__")
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000256 return NotImplemented
257
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000258
Raymond Hettinger74b64952008-02-09 02:53:48 +0000259class Iterator(Iterable):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000260
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700261 __slots__ = ()
262
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000263 @abstractmethod
264 def __next__(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700265 'Return the next item from the iterator. When exhausted, raise StopIteration'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000266 raise StopIteration
267
268 def __iter__(self):
269 return self
270
271 @classmethod
272 def __subclasshook__(cls, C):
273 if cls is Iterator:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700274 return _check_methods(C, '__iter__', '__next__')
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000275 return NotImplemented
276
Christian Heimesf83be4e2007-11-28 09:44:38 +0000277Iterator.register(bytes_iterator)
278Iterator.register(bytearray_iterator)
279#Iterator.register(callable_iterator)
280Iterator.register(dict_keyiterator)
281Iterator.register(dict_valueiterator)
282Iterator.register(dict_itemiterator)
283Iterator.register(list_iterator)
284Iterator.register(list_reverseiterator)
285Iterator.register(range_iterator)
Serhiy Storchaka48b1c3f2016-10-08 22:04:12 +0300286Iterator.register(longrange_iterator)
Christian Heimesf83be4e2007-11-28 09:44:38 +0000287Iterator.register(set_iterator)
288Iterator.register(str_iterator)
289Iterator.register(tuple_iterator)
290Iterator.register(zip_iterator)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000291
Raymond Hettingerbd60e8d2015-05-09 01:07:23 -0400292
Guido van Rossum16ca06b2016-04-04 10:59:29 -0700293class Reversible(Iterable):
294
295 __slots__ = ()
296
297 @abstractmethod
298 def __reversed__(self):
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700299 while False:
300 yield None
Guido van Rossum16ca06b2016-04-04 10:59:29 -0700301
302 @classmethod
303 def __subclasshook__(cls, C):
304 if cls is Reversible:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700305 return _check_methods(C, "__reversed__", "__iter__")
Guido van Rossum16ca06b2016-04-04 10:59:29 -0700306 return NotImplemented
307
308
Raymond Hettingerbd60e8d2015-05-09 01:07:23 -0400309class Generator(Iterator):
310
311 __slots__ = ()
312
313 def __next__(self):
314 """Return the next item from the generator.
315 When exhausted, raise StopIteration.
316 """
317 return self.send(None)
318
319 @abstractmethod
320 def send(self, value):
321 """Send a value into the generator.
322 Return next yielded value or raise StopIteration.
323 """
324 raise StopIteration
325
326 @abstractmethod
327 def throw(self, typ, val=None, tb=None):
328 """Raise an exception in the generator.
329 Return next yielded value or raise StopIteration.
330 """
331 if val is None:
332 if tb is None:
333 raise typ
334 val = typ()
335 if tb is not None:
336 val = val.with_traceback(tb)
337 raise val
338
339 def close(self):
340 """Raise GeneratorExit inside generator.
341 """
342 try:
343 self.throw(GeneratorExit)
344 except (GeneratorExit, StopIteration):
345 pass
346 else:
347 raise RuntimeError("generator ignored GeneratorExit")
348
349 @classmethod
350 def __subclasshook__(cls, C):
351 if cls is Generator:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700352 return _check_methods(C, '__iter__', '__next__',
353 'send', 'throw', 'close')
Raymond Hettingerbd60e8d2015-05-09 01:07:23 -0400354 return NotImplemented
355
Raymond Hettingerbd60e8d2015-05-09 01:07:23 -0400356Generator.register(generator)
357
358
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000359class Sized(metaclass=ABCMeta):
360
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700361 __slots__ = ()
362
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000363 @abstractmethod
364 def __len__(self):
365 return 0
366
367 @classmethod
368 def __subclasshook__(cls, C):
369 if cls is Sized:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700370 return _check_methods(C, "__len__")
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000371 return NotImplemented
372
373
374class Container(metaclass=ABCMeta):
375
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700376 __slots__ = ()
377
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000378 @abstractmethod
379 def __contains__(self, x):
380 return False
381
382 @classmethod
383 def __subclasshook__(cls, C):
384 if cls is Container:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700385 return _check_methods(C, "__contains__")
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000386 return NotImplemented
387
Guido van Rossumf0666942016-08-23 10:47:07 -0700388class Collection(Sized, Iterable, Container):
389
390 __slots__ = ()
391
392 @classmethod
393 def __subclasshook__(cls, C):
394 if cls is Collection:
395 return _check_methods(C, "__len__", "__iter__", "__contains__")
396 return NotImplemented
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000397
398class Callable(metaclass=ABCMeta):
399
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700400 __slots__ = ()
401
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000402 @abstractmethod
Christian Heimes78644762008-03-04 23:39:23 +0000403 def __call__(self, *args, **kwds):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000404 return False
405
406 @classmethod
407 def __subclasshook__(cls, C):
408 if cls is Callable:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700409 return _check_methods(C, "__call__")
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000410 return NotImplemented
411
412
413### SETS ###
414
415
Guido van Rossumf0666942016-08-23 10:47:07 -0700416class Set(Collection):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000417
418 """A set is a finite, iterable container.
419
420 This class provides concrete generic implementations of all
421 methods except for __contains__, __iter__ and __len__.
422
423 To override the comparisons (presumably for speed, as the
Raymond Hettinger11cda472014-07-03 00:31:30 +0100424 semantics are fixed), redefine __le__ and __ge__,
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000425 then the other operations will automatically follow suit.
426 """
427
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700428 __slots__ = ()
429
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000430 def __le__(self, other):
431 if not isinstance(other, Set):
432 return NotImplemented
433 if len(self) > len(other):
434 return False
435 for elem in self:
436 if elem not in other:
437 return False
438 return True
439
440 def __lt__(self, other):
441 if not isinstance(other, Set):
442 return NotImplemented
443 return len(self) < len(other) and self.__le__(other)
444
Raymond Hettinger71909422008-02-09 00:08:16 +0000445 def __gt__(self, other):
446 if not isinstance(other, Set):
447 return NotImplemented
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700448 return len(self) > len(other) and self.__ge__(other)
Raymond Hettinger71909422008-02-09 00:08:16 +0000449
450 def __ge__(self, other):
451 if not isinstance(other, Set):
452 return NotImplemented
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700453 if len(self) < len(other):
454 return False
455 for elem in other:
456 if elem not in self:
457 return False
458 return True
Raymond Hettinger71909422008-02-09 00:08:16 +0000459
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000460 def __eq__(self, other):
461 if not isinstance(other, Set):
462 return NotImplemented
463 return len(self) == len(other) and self.__le__(other)
464
465 @classmethod
466 def _from_iterable(cls, it):
Raymond Hettinger8284c4a2008-02-06 20:47:09 +0000467 '''Construct an instance of the class from any iterable input.
468
469 Must override this method if the class constructor signature
Raymond Hettinger7aebb642008-02-09 03:25:08 +0000470 does not accept an iterable for an input.
Raymond Hettinger8284c4a2008-02-06 20:47:09 +0000471 '''
Raymond Hettinger7aebb642008-02-09 03:25:08 +0000472 return cls(it)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000473
474 def __and__(self, other):
475 if not isinstance(other, Iterable):
476 return NotImplemented
477 return self._from_iterable(value for value in other if value in self)
478
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700479 __rand__ = __and__
480
Christian Heimes190d79e2008-01-30 11:58:22 +0000481 def isdisjoint(self, other):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700482 'Return True if two sets have a null intersection.'
Christian Heimes190d79e2008-01-30 11:58:22 +0000483 for value in other:
484 if value in self:
485 return False
486 return True
487
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000488 def __or__(self, other):
489 if not isinstance(other, Iterable):
490 return NotImplemented
Christian Heimes78644762008-03-04 23:39:23 +0000491 chain = (e for s in (self, other) for e in s)
492 return self._from_iterable(chain)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000493
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700494 __ror__ = __or__
495
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000496 def __sub__(self, other):
497 if not isinstance(other, Set):
498 if not isinstance(other, Iterable):
499 return NotImplemented
500 other = self._from_iterable(other)
501 return self._from_iterable(value for value in self
502 if value not in other)
503
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700504 def __rsub__(self, other):
505 if not isinstance(other, Set):
506 if not isinstance(other, Iterable):
507 return NotImplemented
508 other = self._from_iterable(other)
509 return self._from_iterable(value for value in other
510 if value not in self)
511
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000512 def __xor__(self, other):
513 if not isinstance(other, Set):
514 if not isinstance(other, Iterable):
515 return NotImplemented
516 other = self._from_iterable(other)
517 return (self - other) | (other - self)
518
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700519 __rxor__ = __xor__
520
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000521 def _hash(self):
522 """Compute the hash value of a set.
523
524 Note that we don't define __hash__: not all sets are hashable.
525 But if you define a hashable set type, its __hash__ should
526 call this function.
527
528 This must be compatible __eq__.
529
530 All sets ought to compare equal if they contain the same
531 elements, regardless of how they are implemented, and
532 regardless of the order of the elements; so there's not much
533 freedom for __eq__ or __hash__. We match the algorithm used
534 by the built-in frozenset type.
535 """
Christian Heimesa37d4c62007-12-04 23:02:19 +0000536 MAX = sys.maxsize
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000537 MASK = 2 * MAX + 1
538 n = len(self)
539 h = 1927868237 * (n + 1)
540 h &= MASK
541 for x in self:
542 hx = hash(x)
543 h ^= (hx ^ (hx << 16) ^ 89869747) * 3644798167
544 h &= MASK
545 h = h * 69069 + 907133923
546 h &= MASK
547 if h > MAX:
548 h -= MASK + 1
549 if h == -1:
550 h = 590923713
551 return h
552
553Set.register(frozenset)
554
555
556class MutableSet(Set):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700557 """A mutable set is a finite, iterable container.
558
559 This class provides concrete generic implementations of all
560 methods except for __contains__, __iter__, __len__,
561 add(), and discard().
562
563 To override the comparisons (presumably for speed, as the
564 semantics are fixed), all you have to do is redefine __le__ and
565 then the other operations will automatically follow suit.
566 """
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000567
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700568 __slots__ = ()
569
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000570 @abstractmethod
571 def add(self, value):
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000572 """Add an element."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000573 raise NotImplementedError
574
575 @abstractmethod
576 def discard(self, value):
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000577 """Remove an element. Do not raise an exception if absent."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000578 raise NotImplementedError
579
Christian Heimes190d79e2008-01-30 11:58:22 +0000580 def remove(self, value):
581 """Remove an element. If not a member, raise a KeyError."""
582 if value not in self:
583 raise KeyError(value)
584 self.discard(value)
585
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000586 def pop(self):
587 """Return the popped value. Raise KeyError if empty."""
588 it = iter(self)
589 try:
Raymond Hettingerae650182009-01-28 23:33:59 +0000590 value = next(it)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000591 except StopIteration:
592 raise KeyError
593 self.discard(value)
594 return value
595
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000596 def clear(self):
597 """This is slow (creates N new iterators!) but effective."""
598 try:
599 while True:
600 self.pop()
601 except KeyError:
602 pass
603
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000604 def __ior__(self, it):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000605 for value in it:
606 self.add(value)
607 return self
608
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000609 def __iand__(self, it):
Raymond Hettinger3f10a952009-04-01 19:05:50 +0000610 for value in (self - it):
611 self.discard(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000612 return self
613
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000614 def __ixor__(self, it):
Daniel Stutzbach31da5b22010-08-24 20:49:57 +0000615 if it is self:
616 self.clear()
617 else:
618 if not isinstance(it, Set):
619 it = self._from_iterable(it)
620 for value in it:
621 if value in self:
622 self.discard(value)
623 else:
624 self.add(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000625 return self
626
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000627 def __isub__(self, it):
Daniel Stutzbach31da5b22010-08-24 20:49:57 +0000628 if it is self:
629 self.clear()
630 else:
631 for value in it:
632 self.discard(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000633 return self
634
635MutableSet.register(set)
636
637
638### MAPPINGS ###
639
640
Guido van Rossumf0666942016-08-23 10:47:07 -0700641class Mapping(Collection):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000642
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700643 __slots__ = ()
644
Raymond Hettinger153866e2013-03-24 15:20:29 -0700645 """A Mapping is a generic container for associating key/value
646 pairs.
647
648 This class provides concrete generic implementations of all
649 methods except for __getitem__, __iter__, and __len__.
650
651 """
652
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000653 @abstractmethod
654 def __getitem__(self, key):
655 raise KeyError
656
657 def get(self, key, default=None):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700658 'D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000659 try:
660 return self[key]
661 except KeyError:
662 return default
663
664 def __contains__(self, key):
665 try:
666 self[key]
667 except KeyError:
668 return False
669 else:
670 return True
671
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000672 def keys(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700673 "D.keys() -> a set-like object providing a view on D's keys"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000674 return KeysView(self)
675
676 def items(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700677 "D.items() -> a set-like object providing a view on D's items"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000678 return ItemsView(self)
679
680 def values(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700681 "D.values() -> an object providing a view on D's values"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000682 return ValuesView(self)
683
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000684 def __eq__(self, other):
Benjamin Peterson4ad6bd52010-05-21 20:55:22 +0000685 if not isinstance(other, Mapping):
686 return NotImplemented
687 return dict(self.items()) == dict(other.items())
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000688
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700689 __reversed__ = None
690
Victor Stinner7b17a4e2012-04-20 01:41:36 +0200691Mapping.register(mappingproxy)
692
Christian Heimes2202f872008-02-06 14:31:34 +0000693
Raymond Hettingerbfd06122008-02-09 10:04:32 +0000694class MappingView(Sized):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000695
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700696 __slots__ = '_mapping',
697
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000698 def __init__(self, mapping):
699 self._mapping = mapping
700
701 def __len__(self):
702 return len(self._mapping)
703
Raymond Hettinger89fc2b72009-02-27 07:47:32 +0000704 def __repr__(self):
705 return '{0.__class__.__name__}({0._mapping!r})'.format(self)
706
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000707
708class KeysView(MappingView, Set):
709
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700710 __slots__ = ()
711
Raymond Hettinger9117c752010-08-22 07:44:24 +0000712 @classmethod
713 def _from_iterable(self, it):
714 return set(it)
715
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000716 def __contains__(self, key):
717 return key in self._mapping
718
719 def __iter__(self):
Philip Jenvey4993cc02012-10-01 12:53:43 -0700720 yield from self._mapping
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000721
Christian Heimesf83be4e2007-11-28 09:44:38 +0000722KeysView.register(dict_keys)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000723
724
725class ItemsView(MappingView, Set):
726
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700727 __slots__ = ()
728
Raymond Hettinger9117c752010-08-22 07:44:24 +0000729 @classmethod
730 def _from_iterable(self, it):
731 return set(it)
732
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000733 def __contains__(self, item):
734 key, value = item
735 try:
736 v = self._mapping[key]
737 except KeyError:
738 return False
739 else:
Raymond Hettinger584e8ae2016-05-05 11:14:06 +0300740 return v is value or v == value
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000741
742 def __iter__(self):
743 for key in self._mapping:
744 yield (key, self._mapping[key])
745
Christian Heimesf83be4e2007-11-28 09:44:38 +0000746ItemsView.register(dict_items)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000747
748
749class ValuesView(MappingView):
750
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700751 __slots__ = ()
752
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000753 def __contains__(self, value):
754 for key in self._mapping:
Raymond Hettinger584e8ae2016-05-05 11:14:06 +0300755 v = self._mapping[key]
756 if v is value or v == value:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000757 return True
758 return False
759
760 def __iter__(self):
761 for key in self._mapping:
762 yield self._mapping[key]
763
Christian Heimesf83be4e2007-11-28 09:44:38 +0000764ValuesView.register(dict_values)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000765
766
767class MutableMapping(Mapping):
768
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700769 __slots__ = ()
770
Raymond Hettinger153866e2013-03-24 15:20:29 -0700771 """A MutableMapping is a generic container for associating
772 key/value pairs.
773
774 This class provides concrete generic implementations of all
775 methods except for __getitem__, __setitem__, __delitem__,
776 __iter__, and __len__.
777
778 """
779
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000780 @abstractmethod
781 def __setitem__(self, key, value):
782 raise KeyError
783
784 @abstractmethod
785 def __delitem__(self, key):
786 raise KeyError
787
788 __marker = object()
789
790 def pop(self, key, default=__marker):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700791 '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
792 If key is not found, d is returned if given, otherwise KeyError is raised.
793 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000794 try:
795 value = self[key]
796 except KeyError:
797 if default is self.__marker:
798 raise
799 return default
800 else:
801 del self[key]
802 return value
803
804 def popitem(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700805 '''D.popitem() -> (k, v), remove and return some (key, value) pair
806 as a 2-tuple; but raise KeyError if D is empty.
807 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000808 try:
809 key = next(iter(self))
810 except StopIteration:
811 raise KeyError
812 value = self[key]
813 del self[key]
814 return key, value
815
816 def clear(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700817 'D.clear() -> None. Remove all items from D.'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000818 try:
819 while True:
820 self.popitem()
821 except KeyError:
822 pass
823
Mark Dickinsonb214e902010-07-11 18:53:06 +0000824 def update(*args, **kwds):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700825 ''' D.update([E, ]**F) -> None. Update D from mapping/iterable E and F.
826 If E present and has a .keys() method, does: for k in E: D[k] = E[k]
827 If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v
828 In either case, this is followed by: for k, v in F.items(): D[k] = v
829 '''
Serhiy Storchakaae5cb212014-11-27 16:25:51 +0200830 if not args:
831 raise TypeError("descriptor 'update' of 'MutableMapping' object "
832 "needs an argument")
833 self, *args = args
834 if len(args) > 1:
835 raise TypeError('update expected at most 1 arguments, got %d' %
836 len(args))
837 if args:
838 other = args[0]
839 if isinstance(other, Mapping):
840 for key in other:
841 self[key] = other[key]
842 elif hasattr(other, "keys"):
843 for key in other.keys():
844 self[key] = other[key]
845 else:
846 for key, value in other:
847 self[key] = value
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000848 for key, value in kwds.items():
849 self[key] = value
850
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000851 def setdefault(self, key, default=None):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700852 '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 +0000853 try:
854 return self[key]
855 except KeyError:
856 self[key] = default
857 return default
858
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000859MutableMapping.register(dict)
860
861
862### SEQUENCES ###
863
864
Guido van Rossumf0666942016-08-23 10:47:07 -0700865class Sequence(Reversible, Collection):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000866
867 """All the operations on a read-only sequence.
868
869 Concrete subclasses must override __new__ or __init__,
870 __getitem__, and __len__.
871 """
872
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700873 __slots__ = ()
874
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000875 @abstractmethod
876 def __getitem__(self, index):
877 raise IndexError
878
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000879 def __iter__(self):
880 i = 0
Raymond Hettinger71909422008-02-09 00:08:16 +0000881 try:
882 while True:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000883 v = self[i]
Raymond Hettinger71909422008-02-09 00:08:16 +0000884 yield v
885 i += 1
886 except IndexError:
887 return
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000888
889 def __contains__(self, value):
890 for v in self:
Raymond Hettinger584e8ae2016-05-05 11:14:06 +0300891 if v is value or v == value:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000892 return True
893 return False
894
895 def __reversed__(self):
896 for i in reversed(range(len(self))):
897 yield self[i]
898
Raymond Hettingerec219ba2015-05-22 19:29:22 -0700899 def index(self, value, start=0, stop=None):
900 '''S.index(value, [start, [stop]]) -> integer -- return first index of value.
Raymond Hettinger153866e2013-03-24 15:20:29 -0700901 Raises ValueError if the value is not present.
902 '''
Raymond Hettingerec219ba2015-05-22 19:29:22 -0700903 if start is not None and start < 0:
904 start = max(len(self) + start, 0)
905 if stop is not None and stop < 0:
906 stop += len(self)
907
908 i = start
909 while stop is None or i < stop:
910 try:
911 if self[i] == value:
912 return i
913 except IndexError:
914 break
915 i += 1
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000916 raise ValueError
917
918 def count(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700919 'S.count(value) -> integer -- return number of occurrences of value'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000920 return sum(1 for v in self if v == value)
921
922Sequence.register(tuple)
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000923Sequence.register(str)
Raymond Hettinger9aa53c22009-02-24 11:25:35 +0000924Sequence.register(range)
Nick Coghlan45163cc2013-10-02 22:31:47 +1000925Sequence.register(memoryview)
Guido van Rossumd05eb002007-11-21 22:26:24 +0000926
927
928class ByteString(Sequence):
929
930 """This unifies bytes and bytearray.
931
932 XXX Should add all their methods.
933 """
934
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700935 __slots__ = ()
936
Guido van Rossumd05eb002007-11-21 22:26:24 +0000937ByteString.register(bytes)
938ByteString.register(bytearray)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000939
940
941class MutableSequence(Sequence):
942
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700943 __slots__ = ()
944
Guido van Rossum840c3102013-07-25 11:55:41 -0700945 """All the operations on a read-write sequence.
Raymond Hettinger153866e2013-03-24 15:20:29 -0700946
947 Concrete subclasses must provide __new__ or __init__,
948 __getitem__, __setitem__, __delitem__, __len__, and insert().
949
950 """
951
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000952 @abstractmethod
953 def __setitem__(self, index, value):
954 raise IndexError
955
956 @abstractmethod
957 def __delitem__(self, index):
958 raise IndexError
959
960 @abstractmethod
961 def insert(self, index, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700962 'S.insert(index, value) -- insert value before index'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000963 raise IndexError
964
965 def append(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700966 'S.append(value) -- append value to the end of the sequence'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000967 self.insert(len(self), value)
968
Eli Bendersky9479d1a2011-03-04 05:34:58 +0000969 def clear(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700970 'S.clear() -> None -- remove all items from S'
Eli Bendersky9479d1a2011-03-04 05:34:58 +0000971 try:
972 while True:
973 self.pop()
974 except IndexError:
975 pass
976
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000977 def reverse(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700978 'S.reverse() -- reverse *IN PLACE*'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000979 n = len(self)
980 for i in range(n//2):
981 self[i], self[n-i-1] = self[n-i-1], self[i]
982
983 def extend(self, values):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700984 'S.extend(iterable) -- extend sequence by appending elements from the iterable'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000985 for v in values:
986 self.append(v)
987
988 def pop(self, index=-1):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700989 '''S.pop([index]) -> item -- remove and return item at index (default last).
990 Raise IndexError if list is empty or index is out of range.
991 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000992 v = self[index]
993 del self[index]
994 return v
995
996 def remove(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700997 '''S.remove(value) -- remove first occurrence of value.
998 Raise ValueError if the value is not present.
999 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001000 del self[self.index(value)]
1001
1002 def __iadd__(self, values):
1003 self.extend(values)
Raymond Hettingerc384b222009-05-18 15:35:26 +00001004 return self
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001005
1006MutableSequence.register(list)
Guido van Rossumd05eb002007-11-21 22:26:24 +00001007MutableSequence.register(bytearray) # Multiply inheriting, see ByteString