blob: d3375847e2861cb4e20c981531a8412437001c0d [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 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)
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
65class Hashable(metaclass=ABCMeta):
66
Raymond Hettingerc46759a2011-03-22 11:46:25 -070067 __slots__ = ()
68
Guido van Rossumcd16bf62007-06-13 18:07:49 +000069 @abstractmethod
70 def __hash__(self):
71 return 0
72
73 @classmethod
74 def __subclasshook__(cls, C):
75 if cls is Hashable:
76 for B in C.__mro__:
77 if "__hash__" in B.__dict__:
78 if B.__dict__["__hash__"]:
79 return True
80 break
81 return NotImplemented
82
83
Yury Selivanovfdbeb2b2015-07-03 13:11:35 -040084class Awaitable(metaclass=ABCMeta):
Yury Selivanov56fc6142015-05-29 09:01:29 -040085
86 __slots__ = ()
87
88 @abstractmethod
89 def __await__(self):
90 yield
91
92 @classmethod
93 def __subclasshook__(cls, C):
94 if cls is Awaitable:
95 for B in C.__mro__:
96 if "__await__" in B.__dict__:
97 if B.__dict__["__await__"]:
98 return True
99 break
100 return NotImplemented
101
102
103class Coroutine(Awaitable):
Yury Selivanov75445082015-05-11 22:57:16 -0400104
105 __slots__ = ()
106
107 @abstractmethod
108 def send(self, value):
109 """Send a value into the coroutine.
110 Return next yielded value or raise StopIteration.
111 """
112 raise StopIteration
113
114 @abstractmethod
115 def throw(self, typ, val=None, tb=None):
116 """Raise an exception in the coroutine.
117 Return next yielded value or raise StopIteration.
118 """
119 if val is None:
120 if tb is None:
121 raise typ
122 val = typ()
123 if tb is not None:
124 val = val.with_traceback(tb)
125 raise val
126
127 def close(self):
128 """Raise GeneratorExit inside coroutine.
129 """
130 try:
131 self.throw(GeneratorExit)
132 except (GeneratorExit, StopIteration):
133 pass
134 else:
135 raise RuntimeError("coroutine ignored GeneratorExit")
136
Yury Selivanov75445082015-05-11 22:57:16 -0400137 @classmethod
138 def __subclasshook__(cls, C):
Yury Selivanov56fc6142015-05-29 09:01:29 -0400139 if cls is Coroutine:
140 mro = C.__mro__
141 for method in ('__await__', 'send', 'throw', 'close'):
142 for base in mro:
143 if method in base.__dict__:
144 break
145 else:
146 return NotImplemented
147 return True
Yury Selivanov75445082015-05-11 22:57:16 -0400148 return NotImplemented
149
Yury Selivanov75445082015-05-11 22:57:16 -0400150
Yury Selivanov5376ba92015-06-22 12:19:30 -0400151Coroutine.register(coroutine)
152
153
Yury Selivanove0104ae2015-05-14 12:19:16 -0400154class AsyncIterable(metaclass=ABCMeta):
155
156 __slots__ = ()
157
158 @abstractmethod
159 async def __aiter__(self):
160 return AsyncIterator()
161
162 @classmethod
163 def __subclasshook__(cls, C):
164 if cls is AsyncIterable:
165 if any("__aiter__" in B.__dict__ for B in C.__mro__):
166 return True
167 return NotImplemented
168
169
170class AsyncIterator(AsyncIterable):
171
172 __slots__ = ()
173
174 @abstractmethod
175 async def __anext__(self):
176 """Return the next item or raise StopAsyncIteration when exhausted."""
177 raise StopAsyncIteration
178
179 async def __aiter__(self):
180 return self
181
182 @classmethod
183 def __subclasshook__(cls, C):
184 if cls is AsyncIterator:
185 if (any("__anext__" in B.__dict__ for B in C.__mro__) and
186 any("__aiter__" in B.__dict__ for B in C.__mro__)):
187 return True
188 return NotImplemented
189
190
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000191class Iterable(metaclass=ABCMeta):
192
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700193 __slots__ = ()
194
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000195 @abstractmethod
196 def __iter__(self):
197 while False:
198 yield None
199
200 @classmethod
201 def __subclasshook__(cls, C):
202 if cls is Iterable:
203 if any("__iter__" in B.__dict__ for B in C.__mro__):
204 return True
205 return NotImplemented
206
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000207
Raymond Hettinger74b64952008-02-09 02:53:48 +0000208class Iterator(Iterable):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000209
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700210 __slots__ = ()
211
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000212 @abstractmethod
213 def __next__(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700214 'Return the next item from the iterator. When exhausted, raise StopIteration'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000215 raise StopIteration
216
217 def __iter__(self):
218 return self
219
220 @classmethod
221 def __subclasshook__(cls, C):
222 if cls is Iterator:
Raymond Hettingeread22222010-11-29 03:56:12 +0000223 if (any("__next__" in B.__dict__ for B in C.__mro__) and
224 any("__iter__" in B.__dict__ for B in C.__mro__)):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000225 return True
226 return NotImplemented
227
Christian Heimesf83be4e2007-11-28 09:44:38 +0000228Iterator.register(bytes_iterator)
229Iterator.register(bytearray_iterator)
230#Iterator.register(callable_iterator)
231Iterator.register(dict_keyiterator)
232Iterator.register(dict_valueiterator)
233Iterator.register(dict_itemiterator)
234Iterator.register(list_iterator)
235Iterator.register(list_reverseiterator)
236Iterator.register(range_iterator)
237Iterator.register(set_iterator)
238Iterator.register(str_iterator)
239Iterator.register(tuple_iterator)
240Iterator.register(zip_iterator)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000241
Raymond Hettingerbd60e8d2015-05-09 01:07:23 -0400242
Guido van Rossum16ca06b2016-04-04 10:59:29 -0700243class Reversible(Iterable):
244
245 __slots__ = ()
246
247 @abstractmethod
248 def __reversed__(self):
249 return NotImplemented
250
251 @classmethod
252 def __subclasshook__(cls, C):
253 if cls is Reversible:
254 for B in C.__mro__:
255 if "__reversed__" in B.__dict__:
256 if B.__dict__["__reversed__"] is not None:
257 return True
258 break
259 return NotImplemented
260
261
Raymond Hettingerbd60e8d2015-05-09 01:07:23 -0400262class Generator(Iterator):
263
264 __slots__ = ()
265
266 def __next__(self):
267 """Return the next item from the generator.
268 When exhausted, raise StopIteration.
269 """
270 return self.send(None)
271
272 @abstractmethod
273 def send(self, value):
274 """Send a value into the generator.
275 Return next yielded value or raise StopIteration.
276 """
277 raise StopIteration
278
279 @abstractmethod
280 def throw(self, typ, val=None, tb=None):
281 """Raise an exception in the generator.
282 Return next yielded value or raise StopIteration.
283 """
284 if val is None:
285 if tb is None:
286 raise typ
287 val = typ()
288 if tb is not None:
289 val = val.with_traceback(tb)
290 raise val
291
292 def close(self):
293 """Raise GeneratorExit inside generator.
294 """
295 try:
296 self.throw(GeneratorExit)
297 except (GeneratorExit, StopIteration):
298 pass
299 else:
300 raise RuntimeError("generator ignored GeneratorExit")
301
302 @classmethod
303 def __subclasshook__(cls, C):
304 if cls is Generator:
305 mro = C.__mro__
306 for method in ('__iter__', '__next__', 'send', 'throw', 'close'):
307 for base in mro:
308 if method in base.__dict__:
309 break
310 else:
311 return NotImplemented
312 return True
313 return NotImplemented
314
315
316Generator.register(generator)
317
318
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000319class Sized(metaclass=ABCMeta):
320
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700321 __slots__ = ()
322
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000323 @abstractmethod
324 def __len__(self):
325 return 0
326
327 @classmethod
328 def __subclasshook__(cls, C):
329 if cls is Sized:
330 if any("__len__" in B.__dict__ for B in C.__mro__):
331 return True
332 return NotImplemented
333
334
335class Container(metaclass=ABCMeta):
336
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700337 __slots__ = ()
338
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000339 @abstractmethod
340 def __contains__(self, x):
341 return False
342
343 @classmethod
344 def __subclasshook__(cls, C):
345 if cls is Container:
346 if any("__contains__" in B.__dict__ for B in C.__mro__):
347 return True
348 return NotImplemented
349
350
351class Callable(metaclass=ABCMeta):
352
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700353 __slots__ = ()
354
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000355 @abstractmethod
Christian Heimes78644762008-03-04 23:39:23 +0000356 def __call__(self, *args, **kwds):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000357 return False
358
359 @classmethod
360 def __subclasshook__(cls, C):
361 if cls is Callable:
362 if any("__call__" in B.__dict__ for B in C.__mro__):
363 return True
364 return NotImplemented
365
366
367### SETS ###
368
369
Raymond Hettinger74b64952008-02-09 02:53:48 +0000370class Set(Sized, Iterable, Container):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000371
372 """A set is a finite, iterable container.
373
374 This class provides concrete generic implementations of all
375 methods except for __contains__, __iter__ and __len__.
376
377 To override the comparisons (presumably for speed, as the
Raymond Hettinger11cda472014-07-03 00:31:30 +0100378 semantics are fixed), redefine __le__ and __ge__,
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000379 then the other operations will automatically follow suit.
380 """
381
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700382 __slots__ = ()
383
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000384 def __le__(self, other):
385 if not isinstance(other, Set):
386 return NotImplemented
387 if len(self) > len(other):
388 return False
389 for elem in self:
390 if elem not in other:
391 return False
392 return True
393
394 def __lt__(self, other):
395 if not isinstance(other, Set):
396 return NotImplemented
397 return len(self) < len(other) and self.__le__(other)
398
Raymond Hettinger71909422008-02-09 00:08:16 +0000399 def __gt__(self, other):
400 if not isinstance(other, Set):
401 return NotImplemented
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700402 return len(self) > len(other) and self.__ge__(other)
Raymond Hettinger71909422008-02-09 00:08:16 +0000403
404 def __ge__(self, other):
405 if not isinstance(other, Set):
406 return NotImplemented
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700407 if len(self) < len(other):
408 return False
409 for elem in other:
410 if elem not in self:
411 return False
412 return True
Raymond Hettinger71909422008-02-09 00:08:16 +0000413
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000414 def __eq__(self, other):
415 if not isinstance(other, Set):
416 return NotImplemented
417 return len(self) == len(other) and self.__le__(other)
418
419 @classmethod
420 def _from_iterable(cls, it):
Raymond Hettinger8284c4a2008-02-06 20:47:09 +0000421 '''Construct an instance of the class from any iterable input.
422
423 Must override this method if the class constructor signature
Raymond Hettinger7aebb642008-02-09 03:25:08 +0000424 does not accept an iterable for an input.
Raymond Hettinger8284c4a2008-02-06 20:47:09 +0000425 '''
Raymond Hettinger7aebb642008-02-09 03:25:08 +0000426 return cls(it)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000427
428 def __and__(self, other):
429 if not isinstance(other, Iterable):
430 return NotImplemented
431 return self._from_iterable(value for value in other if value in self)
432
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700433 __rand__ = __and__
434
Christian Heimes190d79e2008-01-30 11:58:22 +0000435 def isdisjoint(self, other):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700436 'Return True if two sets have a null intersection.'
Christian Heimes190d79e2008-01-30 11:58:22 +0000437 for value in other:
438 if value in self:
439 return False
440 return True
441
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000442 def __or__(self, other):
443 if not isinstance(other, Iterable):
444 return NotImplemented
Christian Heimes78644762008-03-04 23:39:23 +0000445 chain = (e for s in (self, other) for e in s)
446 return self._from_iterable(chain)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000447
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700448 __ror__ = __or__
449
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000450 def __sub__(self, other):
451 if not isinstance(other, Set):
452 if not isinstance(other, Iterable):
453 return NotImplemented
454 other = self._from_iterable(other)
455 return self._from_iterable(value for value in self
456 if value not in other)
457
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700458 def __rsub__(self, other):
459 if not isinstance(other, Set):
460 if not isinstance(other, Iterable):
461 return NotImplemented
462 other = self._from_iterable(other)
463 return self._from_iterable(value for value in other
464 if value not in self)
465
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000466 def __xor__(self, other):
467 if not isinstance(other, Set):
468 if not isinstance(other, Iterable):
469 return NotImplemented
470 other = self._from_iterable(other)
471 return (self - other) | (other - self)
472
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700473 __rxor__ = __xor__
474
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000475 def _hash(self):
476 """Compute the hash value of a set.
477
478 Note that we don't define __hash__: not all sets are hashable.
479 But if you define a hashable set type, its __hash__ should
480 call this function.
481
482 This must be compatible __eq__.
483
484 All sets ought to compare equal if they contain the same
485 elements, regardless of how they are implemented, and
486 regardless of the order of the elements; so there's not much
487 freedom for __eq__ or __hash__. We match the algorithm used
488 by the built-in frozenset type.
489 """
Christian Heimesa37d4c62007-12-04 23:02:19 +0000490 MAX = sys.maxsize
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000491 MASK = 2 * MAX + 1
492 n = len(self)
493 h = 1927868237 * (n + 1)
494 h &= MASK
495 for x in self:
496 hx = hash(x)
497 h ^= (hx ^ (hx << 16) ^ 89869747) * 3644798167
498 h &= MASK
499 h = h * 69069 + 907133923
500 h &= MASK
501 if h > MAX:
502 h -= MASK + 1
503 if h == -1:
504 h = 590923713
505 return h
506
507Set.register(frozenset)
508
509
510class MutableSet(Set):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700511 """A mutable set is a finite, iterable container.
512
513 This class provides concrete generic implementations of all
514 methods except for __contains__, __iter__, __len__,
515 add(), and discard().
516
517 To override the comparisons (presumably for speed, as the
518 semantics are fixed), all you have to do is redefine __le__ and
519 then the other operations will automatically follow suit.
520 """
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000521
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700522 __slots__ = ()
523
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000524 @abstractmethod
525 def add(self, value):
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000526 """Add an element."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000527 raise NotImplementedError
528
529 @abstractmethod
530 def discard(self, value):
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000531 """Remove an element. Do not raise an exception if absent."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000532 raise NotImplementedError
533
Christian Heimes190d79e2008-01-30 11:58:22 +0000534 def remove(self, value):
535 """Remove an element. If not a member, raise a KeyError."""
536 if value not in self:
537 raise KeyError(value)
538 self.discard(value)
539
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000540 def pop(self):
541 """Return the popped value. Raise KeyError if empty."""
542 it = iter(self)
543 try:
Raymond Hettingerae650182009-01-28 23:33:59 +0000544 value = next(it)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000545 except StopIteration:
546 raise KeyError
547 self.discard(value)
548 return value
549
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000550 def clear(self):
551 """This is slow (creates N new iterators!) but effective."""
552 try:
553 while True:
554 self.pop()
555 except KeyError:
556 pass
557
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000558 def __ior__(self, it):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000559 for value in it:
560 self.add(value)
561 return self
562
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000563 def __iand__(self, it):
Raymond Hettinger3f10a952009-04-01 19:05:50 +0000564 for value in (self - it):
565 self.discard(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000566 return self
567
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000568 def __ixor__(self, it):
Daniel Stutzbach31da5b22010-08-24 20:49:57 +0000569 if it is self:
570 self.clear()
571 else:
572 if not isinstance(it, Set):
573 it = self._from_iterable(it)
574 for value in it:
575 if value in self:
576 self.discard(value)
577 else:
578 self.add(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000579 return self
580
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000581 def __isub__(self, it):
Daniel Stutzbach31da5b22010-08-24 20:49:57 +0000582 if it is self:
583 self.clear()
584 else:
585 for value in it:
586 self.discard(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000587 return self
588
589MutableSet.register(set)
590
591
592### MAPPINGS ###
593
594
Raymond Hettinger74b64952008-02-09 02:53:48 +0000595class Mapping(Sized, Iterable, Container):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000596
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700597 __slots__ = ()
598
Raymond Hettinger153866e2013-03-24 15:20:29 -0700599 """A Mapping is a generic container for associating key/value
600 pairs.
601
602 This class provides concrete generic implementations of all
603 methods except for __getitem__, __iter__, and __len__.
604
605 """
606
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000607 @abstractmethod
608 def __getitem__(self, key):
609 raise KeyError
610
611 def get(self, key, default=None):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700612 'D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000613 try:
614 return self[key]
615 except KeyError:
616 return default
617
618 def __contains__(self, key):
619 try:
620 self[key]
621 except KeyError:
622 return False
623 else:
624 return True
625
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000626 def keys(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700627 "D.keys() -> a set-like object providing a view on D's keys"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000628 return KeysView(self)
629
630 def items(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700631 "D.items() -> a set-like object providing a view on D's items"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000632 return ItemsView(self)
633
634 def values(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700635 "D.values() -> an object providing a view on D's values"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000636 return ValuesView(self)
637
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000638 def __eq__(self, other):
Benjamin Peterson4ad6bd52010-05-21 20:55:22 +0000639 if not isinstance(other, Mapping):
640 return NotImplemented
641 return dict(self.items()) == dict(other.items())
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000642
Victor Stinner7b17a4e2012-04-20 01:41:36 +0200643Mapping.register(mappingproxy)
644
Christian Heimes2202f872008-02-06 14:31:34 +0000645
Raymond Hettingerbfd06122008-02-09 10:04:32 +0000646class MappingView(Sized):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000647
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700648 __slots__ = '_mapping',
649
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000650 def __init__(self, mapping):
651 self._mapping = mapping
652
653 def __len__(self):
654 return len(self._mapping)
655
Raymond Hettinger89fc2b72009-02-27 07:47:32 +0000656 def __repr__(self):
657 return '{0.__class__.__name__}({0._mapping!r})'.format(self)
658
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000659
660class KeysView(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, key):
669 return key in self._mapping
670
671 def __iter__(self):
Philip Jenvey4993cc02012-10-01 12:53:43 -0700672 yield from self._mapping
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000673
Christian Heimesf83be4e2007-11-28 09:44:38 +0000674KeysView.register(dict_keys)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000675
676
677class ItemsView(MappingView, Set):
678
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700679 __slots__ = ()
680
Raymond Hettinger9117c752010-08-22 07:44:24 +0000681 @classmethod
682 def _from_iterable(self, it):
683 return set(it)
684
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000685 def __contains__(self, item):
686 key, value = item
687 try:
688 v = self._mapping[key]
689 except KeyError:
690 return False
691 else:
692 return v == value
693
694 def __iter__(self):
695 for key in self._mapping:
696 yield (key, self._mapping[key])
697
Christian Heimesf83be4e2007-11-28 09:44:38 +0000698ItemsView.register(dict_items)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000699
700
701class ValuesView(MappingView):
702
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700703 __slots__ = ()
704
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000705 def __contains__(self, value):
706 for key in self._mapping:
707 if value == self._mapping[key]:
708 return True
709 return False
710
711 def __iter__(self):
712 for key in self._mapping:
713 yield self._mapping[key]
714
Christian Heimesf83be4e2007-11-28 09:44:38 +0000715ValuesView.register(dict_values)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000716
717
718class MutableMapping(Mapping):
719
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700720 __slots__ = ()
721
Raymond Hettinger153866e2013-03-24 15:20:29 -0700722 """A MutableMapping is a generic container for associating
723 key/value pairs.
724
725 This class provides concrete generic implementations of all
726 methods except for __getitem__, __setitem__, __delitem__,
727 __iter__, and __len__.
728
729 """
730
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000731 @abstractmethod
732 def __setitem__(self, key, value):
733 raise KeyError
734
735 @abstractmethod
736 def __delitem__(self, key):
737 raise KeyError
738
739 __marker = object()
740
741 def pop(self, key, default=__marker):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700742 '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
743 If key is not found, d is returned if given, otherwise KeyError is raised.
744 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000745 try:
746 value = self[key]
747 except KeyError:
748 if default is self.__marker:
749 raise
750 return default
751 else:
752 del self[key]
753 return value
754
755 def popitem(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700756 '''D.popitem() -> (k, v), remove and return some (key, value) pair
757 as a 2-tuple; but raise KeyError if D is empty.
758 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000759 try:
760 key = next(iter(self))
761 except StopIteration:
762 raise KeyError
763 value = self[key]
764 del self[key]
765 return key, value
766
767 def clear(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700768 'D.clear() -> None. Remove all items from D.'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000769 try:
770 while True:
771 self.popitem()
772 except KeyError:
773 pass
774
Mark Dickinsonb214e902010-07-11 18:53:06 +0000775 def update(*args, **kwds):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700776 ''' D.update([E, ]**F) -> None. Update D from mapping/iterable E and F.
777 If E present and has a .keys() method, does: for k in E: D[k] = E[k]
778 If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v
779 In either case, this is followed by: for k, v in F.items(): D[k] = v
780 '''
Serhiy Storchakaae5cb212014-11-27 16:25:51 +0200781 if not args:
782 raise TypeError("descriptor 'update' of 'MutableMapping' object "
783 "needs an argument")
784 self, *args = args
785 if len(args) > 1:
786 raise TypeError('update expected at most 1 arguments, got %d' %
787 len(args))
788 if args:
789 other = args[0]
790 if isinstance(other, Mapping):
791 for key in other:
792 self[key] = other[key]
793 elif hasattr(other, "keys"):
794 for key in other.keys():
795 self[key] = other[key]
796 else:
797 for key, value in other:
798 self[key] = value
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000799 for key, value in kwds.items():
800 self[key] = value
801
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000802 def setdefault(self, key, default=None):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700803 '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 +0000804 try:
805 return self[key]
806 except KeyError:
807 self[key] = default
808 return default
809
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000810MutableMapping.register(dict)
811
812
813### SEQUENCES ###
814
815
Guido van Rossum16ca06b2016-04-04 10:59:29 -0700816class Sequence(Sized, Reversible, Container):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000817
818 """All the operations on a read-only sequence.
819
820 Concrete subclasses must override __new__ or __init__,
821 __getitem__, and __len__.
822 """
823
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700824 __slots__ = ()
825
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000826 @abstractmethod
827 def __getitem__(self, index):
828 raise IndexError
829
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000830 def __iter__(self):
831 i = 0
Raymond Hettinger71909422008-02-09 00:08:16 +0000832 try:
833 while True:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000834 v = self[i]
Raymond Hettinger71909422008-02-09 00:08:16 +0000835 yield v
836 i += 1
837 except IndexError:
838 return
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000839
840 def __contains__(self, value):
841 for v in self:
842 if v == value:
843 return True
844 return False
845
846 def __reversed__(self):
847 for i in reversed(range(len(self))):
848 yield self[i]
849
Raymond Hettingerec219ba2015-05-22 19:29:22 -0700850 def index(self, value, start=0, stop=None):
851 '''S.index(value, [start, [stop]]) -> integer -- return first index of value.
Raymond Hettinger153866e2013-03-24 15:20:29 -0700852 Raises ValueError if the value is not present.
853 '''
Raymond Hettingerec219ba2015-05-22 19:29:22 -0700854 if start is not None and start < 0:
855 start = max(len(self) + start, 0)
856 if stop is not None and stop < 0:
857 stop += len(self)
858
859 i = start
860 while stop is None or i < stop:
861 try:
862 if self[i] == value:
863 return i
864 except IndexError:
865 break
866 i += 1
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000867 raise ValueError
868
869 def count(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700870 'S.count(value) -> integer -- return number of occurrences of value'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000871 return sum(1 for v in self if v == value)
872
873Sequence.register(tuple)
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000874Sequence.register(str)
Raymond Hettinger9aa53c22009-02-24 11:25:35 +0000875Sequence.register(range)
Nick Coghlan45163cc2013-10-02 22:31:47 +1000876Sequence.register(memoryview)
Guido van Rossumd05eb002007-11-21 22:26:24 +0000877
878
879class ByteString(Sequence):
880
881 """This unifies bytes and bytearray.
882
883 XXX Should add all their methods.
884 """
885
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700886 __slots__ = ()
887
Guido van Rossumd05eb002007-11-21 22:26:24 +0000888ByteString.register(bytes)
889ByteString.register(bytearray)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000890
891
892class MutableSequence(Sequence):
893
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700894 __slots__ = ()
895
Guido van Rossum840c3102013-07-25 11:55:41 -0700896 """All the operations on a read-write sequence.
Raymond Hettinger153866e2013-03-24 15:20:29 -0700897
898 Concrete subclasses must provide __new__ or __init__,
899 __getitem__, __setitem__, __delitem__, __len__, and insert().
900
901 """
902
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000903 @abstractmethod
904 def __setitem__(self, index, value):
905 raise IndexError
906
907 @abstractmethod
908 def __delitem__(self, index):
909 raise IndexError
910
911 @abstractmethod
912 def insert(self, index, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700913 'S.insert(index, value) -- insert value before index'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000914 raise IndexError
915
916 def append(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700917 'S.append(value) -- append value to the end of the sequence'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000918 self.insert(len(self), value)
919
Eli Bendersky9479d1a2011-03-04 05:34:58 +0000920 def clear(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700921 'S.clear() -> None -- remove all items from S'
Eli Bendersky9479d1a2011-03-04 05:34:58 +0000922 try:
923 while True:
924 self.pop()
925 except IndexError:
926 pass
927
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000928 def reverse(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700929 'S.reverse() -- reverse *IN PLACE*'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000930 n = len(self)
931 for i in range(n//2):
932 self[i], self[n-i-1] = self[n-i-1], self[i]
933
934 def extend(self, values):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700935 'S.extend(iterable) -- extend sequence by appending elements from the iterable'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000936 for v in values:
937 self.append(v)
938
939 def pop(self, index=-1):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700940 '''S.pop([index]) -> item -- remove and return item at index (default last).
941 Raise IndexError if list is empty or index is out of range.
942 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000943 v = self[index]
944 del self[index]
945 return v
946
947 def remove(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700948 '''S.remove(value) -- remove first occurrence of value.
949 Raise ValueError if the value is not present.
950 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000951 del self[self.index(value)]
952
953 def __iadd__(self, values):
954 self.extend(values)
Raymond Hettingerc384b222009-05-18 15:35:26 +0000955 return self
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000956
957MutableSequence.register(list)
Guido van Rossumd05eb002007-11-21 22:26:24 +0000958MutableSequence.register(bytearray) # Multiply inheriting, see ByteString