blob: 8bebd69bc7f8d6afe872f5e1756b7417e4e022b7 [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",
Yury Selivanov75445082015-05-11 22:57:16 -040013 "Hashable", "Iterable", "Iterator", "Generator",
Guido van Rossumcd16bf62007-06-13 18:07:49 +000014 "Sized", "Container", "Callable",
15 "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)
Serhiy Storchaka3bd9fde2016-10-08 21:33:59 +030032# Note: in other implementations, these types might not be distinct
33# and they may have their own implementation specific types that
Raymond Hettinger02184282012-04-05 13:31:12 -070034# 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)))
Serhiy Storchaka48b1c3f2016-10-08 22:04:12 +030044longrange_iterator = type(iter(range(1 << 1000)))
Christian Heimesf83be4e2007-11-28 09:44:38 +000045set_iterator = type(iter(set()))
46str_iterator = type(iter(""))
47tuple_iterator = type(iter(()))
48zip_iterator = type(iter(zip()))
49## views ##
50dict_keys = type({}.keys())
51dict_values = type({}.values())
52dict_items = type({}.items())
Christian Heimes0db38532007-11-29 16:21:13 +000053## misc ##
Victor Stinner7b17a4e2012-04-20 01:41:36 +020054mappingproxy = type(type.__dict__)
Raymond Hettingerbd60e8d2015-05-09 01:07:23 -040055generator = type((lambda: (yield))())
Yury Selivanov5376ba92015-06-22 12:19:30 -040056## coroutine ##
57async def _coro(): pass
58_coro = _coro()
59coroutine = type(_coro)
60_coro.close() # Prevent ResourceWarning
61del _coro
Christian Heimesf83be4e2007-11-28 09:44:38 +000062
63
Guido van Rossumcd16bf62007-06-13 18:07:49 +000064### ONE-TRICK PONIES ###
65
66class Hashable(metaclass=ABCMeta):
67
Raymond Hettingerc46759a2011-03-22 11:46:25 -070068 __slots__ = ()
69
Guido van Rossumcd16bf62007-06-13 18:07:49 +000070 @abstractmethod
71 def __hash__(self):
72 return 0
73
74 @classmethod
75 def __subclasshook__(cls, C):
76 if cls is Hashable:
77 for B in C.__mro__:
78 if "__hash__" in B.__dict__:
79 if B.__dict__["__hash__"]:
80 return True
81 break
82 return NotImplemented
83
84
Yury Selivanovfdbeb2b2015-07-03 13:11:35 -040085class Awaitable(metaclass=ABCMeta):
Yury Selivanov56fc6142015-05-29 09:01:29 -040086
87 __slots__ = ()
88
89 @abstractmethod
90 def __await__(self):
91 yield
92
93 @classmethod
94 def __subclasshook__(cls, C):
95 if cls is Awaitable:
96 for B in C.__mro__:
97 if "__await__" in B.__dict__:
98 if B.__dict__["__await__"]:
99 return True
100 break
101 return NotImplemented
102
103
104class Coroutine(Awaitable):
Yury Selivanov75445082015-05-11 22:57:16 -0400105
106 __slots__ = ()
107
108 @abstractmethod
109 def send(self, value):
110 """Send a value into the coroutine.
111 Return next yielded value or raise StopIteration.
112 """
113 raise StopIteration
114
115 @abstractmethod
116 def throw(self, typ, val=None, tb=None):
117 """Raise an exception in the coroutine.
118 Return next yielded value or raise StopIteration.
119 """
120 if val is None:
121 if tb is None:
122 raise typ
123 val = typ()
124 if tb is not None:
125 val = val.with_traceback(tb)
126 raise val
127
128 def close(self):
129 """Raise GeneratorExit inside coroutine.
130 """
131 try:
132 self.throw(GeneratorExit)
133 except (GeneratorExit, StopIteration):
134 pass
135 else:
136 raise RuntimeError("coroutine ignored GeneratorExit")
137
Yury Selivanov75445082015-05-11 22:57:16 -0400138 @classmethod
139 def __subclasshook__(cls, C):
Yury Selivanov56fc6142015-05-29 09:01:29 -0400140 if cls is Coroutine:
141 mro = C.__mro__
142 for method in ('__await__', 'send', 'throw', 'close'):
143 for base in mro:
144 if method in base.__dict__:
145 break
146 else:
147 return NotImplemented
148 return True
Yury Selivanov75445082015-05-11 22:57:16 -0400149 return NotImplemented
150
Yury Selivanov75445082015-05-11 22:57:16 -0400151
Yury Selivanov5376ba92015-06-22 12:19:30 -0400152Coroutine.register(coroutine)
153
154
Yury Selivanove0104ae2015-05-14 12:19:16 -0400155class AsyncIterable(metaclass=ABCMeta):
156
157 __slots__ = ()
158
159 @abstractmethod
Yury Selivanova6f6edb2016-06-09 15:08:31 -0400160 def __aiter__(self):
Yury Selivanove0104ae2015-05-14 12:19:16 -0400161 return AsyncIterator()
162
163 @classmethod
164 def __subclasshook__(cls, C):
165 if cls is AsyncIterable:
166 if any("__aiter__" in B.__dict__ for B in C.__mro__):
167 return True
168 return NotImplemented
169
170
171class AsyncIterator(AsyncIterable):
172
173 __slots__ = ()
174
175 @abstractmethod
176 async def __anext__(self):
177 """Return the next item or raise StopAsyncIteration when exhausted."""
178 raise StopAsyncIteration
179
Yury Selivanova6f6edb2016-06-09 15:08:31 -0400180 def __aiter__(self):
Yury Selivanove0104ae2015-05-14 12:19:16 -0400181 return self
182
183 @classmethod
184 def __subclasshook__(cls, C):
185 if cls is AsyncIterator:
186 if (any("__anext__" in B.__dict__ for B in C.__mro__) and
187 any("__aiter__" in B.__dict__ for B in C.__mro__)):
188 return True
189 return NotImplemented
190
191
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000192class Iterable(metaclass=ABCMeta):
193
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700194 __slots__ = ()
195
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000196 @abstractmethod
197 def __iter__(self):
198 while False:
199 yield None
200
201 @classmethod
202 def __subclasshook__(cls, C):
203 if cls is Iterable:
204 if any("__iter__" in B.__dict__ for B in C.__mro__):
205 return True
206 return NotImplemented
207
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000208
Raymond Hettinger74b64952008-02-09 02:53:48 +0000209class Iterator(Iterable):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000210
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700211 __slots__ = ()
212
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000213 @abstractmethod
214 def __next__(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700215 'Return the next item from the iterator. When exhausted, raise StopIteration'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000216 raise StopIteration
217
218 def __iter__(self):
219 return self
220
221 @classmethod
222 def __subclasshook__(cls, C):
223 if cls is Iterator:
Raymond Hettingeread22222010-11-29 03:56:12 +0000224 if (any("__next__" in B.__dict__ for B in C.__mro__) and
225 any("__iter__" in B.__dict__ for B in C.__mro__)):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000226 return True
227 return NotImplemented
228
Christian Heimesf83be4e2007-11-28 09:44:38 +0000229Iterator.register(bytes_iterator)
230Iterator.register(bytearray_iterator)
231#Iterator.register(callable_iterator)
232Iterator.register(dict_keyiterator)
233Iterator.register(dict_valueiterator)
234Iterator.register(dict_itemiterator)
235Iterator.register(list_iterator)
236Iterator.register(list_reverseiterator)
237Iterator.register(range_iterator)
Serhiy Storchaka48b1c3f2016-10-08 22:04:12 +0300238Iterator.register(longrange_iterator)
Christian Heimesf83be4e2007-11-28 09:44:38 +0000239Iterator.register(set_iterator)
240Iterator.register(str_iterator)
241Iterator.register(tuple_iterator)
242Iterator.register(zip_iterator)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000243
Raymond Hettingerbd60e8d2015-05-09 01:07:23 -0400244
245class Generator(Iterator):
246
247 __slots__ = ()
248
249 def __next__(self):
250 """Return the next item from the generator.
251 When exhausted, raise StopIteration.
252 """
253 return self.send(None)
254
255 @abstractmethod
256 def send(self, value):
257 """Send a value into the generator.
258 Return next yielded value or raise StopIteration.
259 """
260 raise StopIteration
261
262 @abstractmethod
263 def throw(self, typ, val=None, tb=None):
264 """Raise an exception in the generator.
265 Return next yielded value or raise StopIteration.
266 """
267 if val is None:
268 if tb is None:
269 raise typ
270 val = typ()
271 if tb is not None:
272 val = val.with_traceback(tb)
273 raise val
274
275 def close(self):
276 """Raise GeneratorExit inside generator.
277 """
278 try:
279 self.throw(GeneratorExit)
280 except (GeneratorExit, StopIteration):
281 pass
282 else:
283 raise RuntimeError("generator ignored GeneratorExit")
284
285 @classmethod
286 def __subclasshook__(cls, C):
287 if cls is Generator:
288 mro = C.__mro__
289 for method in ('__iter__', '__next__', 'send', 'throw', 'close'):
290 for base in mro:
291 if method in base.__dict__:
292 break
293 else:
294 return NotImplemented
295 return True
296 return NotImplemented
297
298
299Generator.register(generator)
300
301
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000302class Sized(metaclass=ABCMeta):
303
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700304 __slots__ = ()
305
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000306 @abstractmethod
307 def __len__(self):
308 return 0
309
310 @classmethod
311 def __subclasshook__(cls, C):
312 if cls is Sized:
313 if any("__len__" in B.__dict__ for B in C.__mro__):
314 return True
315 return NotImplemented
316
317
318class Container(metaclass=ABCMeta):
319
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700320 __slots__ = ()
321
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000322 @abstractmethod
323 def __contains__(self, x):
324 return False
325
326 @classmethod
327 def __subclasshook__(cls, C):
328 if cls is Container:
329 if any("__contains__" in B.__dict__ for B in C.__mro__):
330 return True
331 return NotImplemented
332
333
334class Callable(metaclass=ABCMeta):
335
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700336 __slots__ = ()
337
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000338 @abstractmethod
Christian Heimes78644762008-03-04 23:39:23 +0000339 def __call__(self, *args, **kwds):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000340 return False
341
342 @classmethod
343 def __subclasshook__(cls, C):
344 if cls is Callable:
345 if any("__call__" in B.__dict__ for B in C.__mro__):
346 return True
347 return NotImplemented
348
349
350### SETS ###
351
352
Raymond Hettinger74b64952008-02-09 02:53:48 +0000353class Set(Sized, Iterable, Container):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000354
355 """A set is a finite, iterable container.
356
357 This class provides concrete generic implementations of all
358 methods except for __contains__, __iter__ and __len__.
359
360 To override the comparisons (presumably for speed, as the
Raymond Hettinger11cda472014-07-03 00:31:30 +0100361 semantics are fixed), redefine __le__ and __ge__,
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000362 then the other operations will automatically follow suit.
363 """
364
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700365 __slots__ = ()
366
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000367 def __le__(self, other):
368 if not isinstance(other, Set):
369 return NotImplemented
370 if len(self) > len(other):
371 return False
372 for elem in self:
373 if elem not in other:
374 return False
375 return True
376
377 def __lt__(self, other):
378 if not isinstance(other, Set):
379 return NotImplemented
380 return len(self) < len(other) and self.__le__(other)
381
Raymond Hettinger71909422008-02-09 00:08:16 +0000382 def __gt__(self, other):
383 if not isinstance(other, Set):
384 return NotImplemented
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700385 return len(self) > len(other) and self.__ge__(other)
Raymond Hettinger71909422008-02-09 00:08:16 +0000386
387 def __ge__(self, other):
388 if not isinstance(other, Set):
389 return NotImplemented
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700390 if len(self) < len(other):
391 return False
392 for elem in other:
393 if elem not in self:
394 return False
395 return True
Raymond Hettinger71909422008-02-09 00:08:16 +0000396
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000397 def __eq__(self, other):
398 if not isinstance(other, Set):
399 return NotImplemented
400 return len(self) == len(other) and self.__le__(other)
401
402 @classmethod
403 def _from_iterable(cls, it):
Raymond Hettinger8284c4a2008-02-06 20:47:09 +0000404 '''Construct an instance of the class from any iterable input.
405
406 Must override this method if the class constructor signature
Raymond Hettinger7aebb642008-02-09 03:25:08 +0000407 does not accept an iterable for an input.
Raymond Hettinger8284c4a2008-02-06 20:47:09 +0000408 '''
Raymond Hettinger7aebb642008-02-09 03:25:08 +0000409 return cls(it)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000410
411 def __and__(self, other):
412 if not isinstance(other, Iterable):
413 return NotImplemented
414 return self._from_iterable(value for value in other if value in self)
415
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700416 __rand__ = __and__
417
Christian Heimes190d79e2008-01-30 11:58:22 +0000418 def isdisjoint(self, other):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700419 'Return True if two sets have a null intersection.'
Christian Heimes190d79e2008-01-30 11:58:22 +0000420 for value in other:
421 if value in self:
422 return False
423 return True
424
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000425 def __or__(self, other):
426 if not isinstance(other, Iterable):
427 return NotImplemented
Christian Heimes78644762008-03-04 23:39:23 +0000428 chain = (e for s in (self, other) for e in s)
429 return self._from_iterable(chain)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000430
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700431 __ror__ = __or__
432
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000433 def __sub__(self, other):
434 if not isinstance(other, Set):
435 if not isinstance(other, Iterable):
436 return NotImplemented
437 other = self._from_iterable(other)
438 return self._from_iterable(value for value in self
439 if value not in other)
440
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700441 def __rsub__(self, other):
442 if not isinstance(other, Set):
443 if not isinstance(other, Iterable):
444 return NotImplemented
445 other = self._from_iterable(other)
446 return self._from_iterable(value for value in other
447 if value not in self)
448
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000449 def __xor__(self, other):
450 if not isinstance(other, Set):
451 if not isinstance(other, Iterable):
452 return NotImplemented
453 other = self._from_iterable(other)
454 return (self - other) | (other - self)
455
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700456 __rxor__ = __xor__
457
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000458 def _hash(self):
459 """Compute the hash value of a set.
460
461 Note that we don't define __hash__: not all sets are hashable.
462 But if you define a hashable set type, its __hash__ should
463 call this function.
464
465 This must be compatible __eq__.
466
467 All sets ought to compare equal if they contain the same
468 elements, regardless of how they are implemented, and
469 regardless of the order of the elements; so there's not much
470 freedom for __eq__ or __hash__. We match the algorithm used
471 by the built-in frozenset type.
472 """
Christian Heimesa37d4c62007-12-04 23:02:19 +0000473 MAX = sys.maxsize
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000474 MASK = 2 * MAX + 1
475 n = len(self)
476 h = 1927868237 * (n + 1)
477 h &= MASK
478 for x in self:
479 hx = hash(x)
480 h ^= (hx ^ (hx << 16) ^ 89869747) * 3644798167
481 h &= MASK
482 h = h * 69069 + 907133923
483 h &= MASK
484 if h > MAX:
485 h -= MASK + 1
486 if h == -1:
487 h = 590923713
488 return h
489
490Set.register(frozenset)
491
492
493class MutableSet(Set):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700494 """A mutable set is a finite, iterable container.
495
496 This class provides concrete generic implementations of all
497 methods except for __contains__, __iter__, __len__,
498 add(), and discard().
499
500 To override the comparisons (presumably for speed, as the
501 semantics are fixed), all you have to do is redefine __le__ and
502 then the other operations will automatically follow suit.
503 """
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000504
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700505 __slots__ = ()
506
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000507 @abstractmethod
508 def add(self, value):
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000509 """Add an element."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000510 raise NotImplementedError
511
512 @abstractmethod
513 def discard(self, value):
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000514 """Remove an element. Do not raise an exception if absent."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000515 raise NotImplementedError
516
Christian Heimes190d79e2008-01-30 11:58:22 +0000517 def remove(self, value):
518 """Remove an element. If not a member, raise a KeyError."""
519 if value not in self:
520 raise KeyError(value)
521 self.discard(value)
522
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000523 def pop(self):
524 """Return the popped value. Raise KeyError if empty."""
525 it = iter(self)
526 try:
Raymond Hettingerae650182009-01-28 23:33:59 +0000527 value = next(it)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000528 except StopIteration:
529 raise KeyError
530 self.discard(value)
531 return value
532
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000533 def clear(self):
534 """This is slow (creates N new iterators!) but effective."""
535 try:
536 while True:
537 self.pop()
538 except KeyError:
539 pass
540
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000541 def __ior__(self, it):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000542 for value in it:
543 self.add(value)
544 return self
545
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000546 def __iand__(self, it):
Raymond Hettinger3f10a952009-04-01 19:05:50 +0000547 for value in (self - it):
548 self.discard(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000549 return self
550
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000551 def __ixor__(self, it):
Daniel Stutzbach31da5b22010-08-24 20:49:57 +0000552 if it is self:
553 self.clear()
554 else:
555 if not isinstance(it, Set):
556 it = self._from_iterable(it)
557 for value in it:
558 if value in self:
559 self.discard(value)
560 else:
561 self.add(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000562 return self
563
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000564 def __isub__(self, it):
Daniel Stutzbach31da5b22010-08-24 20:49:57 +0000565 if it is self:
566 self.clear()
567 else:
568 for value in it:
569 self.discard(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000570 return self
571
572MutableSet.register(set)
573
574
575### MAPPINGS ###
576
577
Raymond Hettinger74b64952008-02-09 02:53:48 +0000578class Mapping(Sized, Iterable, Container):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000579
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700580 __slots__ = ()
581
Raymond Hettinger153866e2013-03-24 15:20:29 -0700582 """A Mapping is a generic container for associating key/value
583 pairs.
584
585 This class provides concrete generic implementations of all
586 methods except for __getitem__, __iter__, and __len__.
587
588 """
589
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000590 @abstractmethod
591 def __getitem__(self, key):
592 raise KeyError
593
594 def get(self, key, default=None):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700595 'D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000596 try:
597 return self[key]
598 except KeyError:
599 return default
600
601 def __contains__(self, key):
602 try:
603 self[key]
604 except KeyError:
605 return False
606 else:
607 return True
608
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000609 def keys(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700610 "D.keys() -> a set-like object providing a view on D's keys"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000611 return KeysView(self)
612
613 def items(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700614 "D.items() -> a set-like object providing a view on D's items"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000615 return ItemsView(self)
616
617 def values(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700618 "D.values() -> an object providing a view on D's values"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000619 return ValuesView(self)
620
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000621 def __eq__(self, other):
Benjamin Peterson4ad6bd52010-05-21 20:55:22 +0000622 if not isinstance(other, Mapping):
623 return NotImplemented
624 return dict(self.items()) == dict(other.items())
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000625
Victor Stinner7b17a4e2012-04-20 01:41:36 +0200626Mapping.register(mappingproxy)
627
Christian Heimes2202f872008-02-06 14:31:34 +0000628
Raymond Hettingerbfd06122008-02-09 10:04:32 +0000629class MappingView(Sized):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000630
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700631 __slots__ = '_mapping',
632
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000633 def __init__(self, mapping):
634 self._mapping = mapping
635
636 def __len__(self):
637 return len(self._mapping)
638
Raymond Hettinger89fc2b72009-02-27 07:47:32 +0000639 def __repr__(self):
640 return '{0.__class__.__name__}({0._mapping!r})'.format(self)
641
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000642
643class KeysView(MappingView, Set):
644
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700645 __slots__ = ()
646
Raymond Hettinger9117c752010-08-22 07:44:24 +0000647 @classmethod
648 def _from_iterable(self, it):
649 return set(it)
650
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000651 def __contains__(self, key):
652 return key in self._mapping
653
654 def __iter__(self):
Philip Jenvey4993cc02012-10-01 12:53:43 -0700655 yield from self._mapping
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000656
Christian Heimesf83be4e2007-11-28 09:44:38 +0000657KeysView.register(dict_keys)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000658
659
660class ItemsView(MappingView, Set):
661
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700662 __slots__ = ()
663
Raymond Hettinger9117c752010-08-22 07:44:24 +0000664 @classmethod
665 def _from_iterable(self, it):
666 return set(it)
667
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000668 def __contains__(self, item):
669 key, value = item
670 try:
671 v = self._mapping[key]
672 except KeyError:
673 return False
674 else:
675 return v == value
676
677 def __iter__(self):
678 for key in self._mapping:
679 yield (key, self._mapping[key])
680
Christian Heimesf83be4e2007-11-28 09:44:38 +0000681ItemsView.register(dict_items)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000682
683
684class ValuesView(MappingView):
685
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700686 __slots__ = ()
687
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000688 def __contains__(self, value):
689 for key in self._mapping:
690 if value == self._mapping[key]:
691 return True
692 return False
693
694 def __iter__(self):
695 for key in self._mapping:
696 yield self._mapping[key]
697
Christian Heimesf83be4e2007-11-28 09:44:38 +0000698ValuesView.register(dict_values)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000699
700
701class MutableMapping(Mapping):
702
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700703 __slots__ = ()
704
Raymond Hettinger153866e2013-03-24 15:20:29 -0700705 """A MutableMapping is a generic container for associating
706 key/value pairs.
707
708 This class provides concrete generic implementations of all
709 methods except for __getitem__, __setitem__, __delitem__,
710 __iter__, and __len__.
711
712 """
713
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000714 @abstractmethod
715 def __setitem__(self, key, value):
716 raise KeyError
717
718 @abstractmethod
719 def __delitem__(self, key):
720 raise KeyError
721
722 __marker = object()
723
724 def pop(self, key, default=__marker):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700725 '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
726 If key is not found, d is returned if given, otherwise KeyError is raised.
727 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000728 try:
729 value = self[key]
730 except KeyError:
731 if default is self.__marker:
732 raise
733 return default
734 else:
735 del self[key]
736 return value
737
738 def popitem(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700739 '''D.popitem() -> (k, v), remove and return some (key, value) pair
740 as a 2-tuple; but raise KeyError if D is empty.
741 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000742 try:
743 key = next(iter(self))
744 except StopIteration:
745 raise KeyError
746 value = self[key]
747 del self[key]
748 return key, value
749
750 def clear(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700751 'D.clear() -> None. Remove all items from D.'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000752 try:
753 while True:
754 self.popitem()
755 except KeyError:
756 pass
757
Mark Dickinsonb214e902010-07-11 18:53:06 +0000758 def update(*args, **kwds):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700759 ''' D.update([E, ]**F) -> None. Update D from mapping/iterable E and F.
760 If E present and has a .keys() method, does: for k in E: D[k] = E[k]
761 If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v
762 In either case, this is followed by: for k, v in F.items(): D[k] = v
763 '''
Serhiy Storchakaae5cb212014-11-27 16:25:51 +0200764 if not args:
765 raise TypeError("descriptor 'update' of 'MutableMapping' object "
766 "needs an argument")
767 self, *args = args
768 if len(args) > 1:
769 raise TypeError('update expected at most 1 arguments, got %d' %
770 len(args))
771 if args:
772 other = args[0]
773 if isinstance(other, Mapping):
774 for key in other:
775 self[key] = other[key]
776 elif hasattr(other, "keys"):
777 for key in other.keys():
778 self[key] = other[key]
779 else:
780 for key, value in other:
781 self[key] = value
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000782 for key, value in kwds.items():
783 self[key] = value
784
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000785 def setdefault(self, key, default=None):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700786 '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 +0000787 try:
788 return self[key]
789 except KeyError:
790 self[key] = default
791 return default
792
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000793MutableMapping.register(dict)
794
795
796### SEQUENCES ###
797
798
Raymond Hettinger74b64952008-02-09 02:53:48 +0000799class Sequence(Sized, Iterable, Container):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000800
801 """All the operations on a read-only sequence.
802
803 Concrete subclasses must override __new__ or __init__,
804 __getitem__, and __len__.
805 """
806
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700807 __slots__ = ()
808
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000809 @abstractmethod
810 def __getitem__(self, index):
811 raise IndexError
812
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000813 def __iter__(self):
814 i = 0
Raymond Hettinger71909422008-02-09 00:08:16 +0000815 try:
816 while True:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000817 v = self[i]
Raymond Hettinger71909422008-02-09 00:08:16 +0000818 yield v
819 i += 1
820 except IndexError:
821 return
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000822
823 def __contains__(self, value):
824 for v in self:
825 if v == value:
826 return True
827 return False
828
829 def __reversed__(self):
830 for i in reversed(range(len(self))):
831 yield self[i]
832
Raymond Hettingerec219ba2015-05-22 19:29:22 -0700833 def index(self, value, start=0, stop=None):
834 '''S.index(value, [start, [stop]]) -> integer -- return first index of value.
Raymond Hettinger153866e2013-03-24 15:20:29 -0700835 Raises ValueError if the value is not present.
836 '''
Raymond Hettingerec219ba2015-05-22 19:29:22 -0700837 if start is not None and start < 0:
838 start = max(len(self) + start, 0)
839 if stop is not None and stop < 0:
840 stop += len(self)
841
842 i = start
843 while stop is None or i < stop:
844 try:
845 if self[i] == value:
846 return i
847 except IndexError:
848 break
849 i += 1
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000850 raise ValueError
851
852 def count(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700853 'S.count(value) -> integer -- return number of occurrences of value'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000854 return sum(1 for v in self if v == value)
855
856Sequence.register(tuple)
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000857Sequence.register(str)
Raymond Hettinger9aa53c22009-02-24 11:25:35 +0000858Sequence.register(range)
Nick Coghlan45163cc2013-10-02 22:31:47 +1000859Sequence.register(memoryview)
Guido van Rossumd05eb002007-11-21 22:26:24 +0000860
861
862class ByteString(Sequence):
863
864 """This unifies bytes and bytearray.
865
866 XXX Should add all their methods.
867 """
868
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700869 __slots__ = ()
870
Guido van Rossumd05eb002007-11-21 22:26:24 +0000871ByteString.register(bytes)
872ByteString.register(bytearray)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000873
874
875class MutableSequence(Sequence):
876
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700877 __slots__ = ()
878
Guido van Rossum840c3102013-07-25 11:55:41 -0700879 """All the operations on a read-write sequence.
Raymond Hettinger153866e2013-03-24 15:20:29 -0700880
881 Concrete subclasses must provide __new__ or __init__,
882 __getitem__, __setitem__, __delitem__, __len__, and insert().
883
884 """
885
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000886 @abstractmethod
887 def __setitem__(self, index, value):
888 raise IndexError
889
890 @abstractmethod
891 def __delitem__(self, index):
892 raise IndexError
893
894 @abstractmethod
895 def insert(self, index, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700896 'S.insert(index, value) -- insert value before index'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000897 raise IndexError
898
899 def append(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700900 'S.append(value) -- append value to the end of the sequence'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000901 self.insert(len(self), value)
902
Eli Bendersky9479d1a2011-03-04 05:34:58 +0000903 def clear(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700904 'S.clear() -> None -- remove all items from S'
Eli Bendersky9479d1a2011-03-04 05:34:58 +0000905 try:
906 while True:
907 self.pop()
908 except IndexError:
909 pass
910
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000911 def reverse(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700912 'S.reverse() -- reverse *IN PLACE*'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000913 n = len(self)
914 for i in range(n//2):
915 self[i], self[n-i-1] = self[n-i-1], self[i]
916
917 def extend(self, values):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700918 'S.extend(iterable) -- extend sequence by appending elements from the iterable'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000919 for v in values:
920 self.append(v)
921
922 def pop(self, index=-1):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700923 '''S.pop([index]) -> item -- remove and return item at index (default last).
924 Raise IndexError if list is empty or index is out of range.
925 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000926 v = self[index]
927 del self[index]
928 return v
929
930 def remove(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700931 '''S.remove(value) -- remove first occurrence of value.
932 Raise ValueError if the value is not present.
933 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000934 del self[self.index(value)]
935
936 def __iadd__(self, values):
937 self.extend(values)
Raymond Hettingerc384b222009-05-18 15:35:26 +0000938 return self
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000939
940MutableSequence.register(list)
Guido van Rossumd05eb002007-11-21 22:26:24 +0000941MutableSequence.register(bytearray) # Multiply inheriting, see ByteString