blob: fc9c9f1cc14eee1f7399c1a3c7599c139cebbd32 [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)
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
Yury Selivanova6f6edb2016-06-09 15:08:31 -0400159 def __aiter__(self):
Yury Selivanove0104ae2015-05-14 12:19:16 -0400160 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
Yury Selivanova6f6edb2016-06-09 15:08:31 -0400179 def __aiter__(self):
Yury Selivanove0104ae2015-05-14 12:19:16 -0400180 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
243class Generator(Iterator):
244
245 __slots__ = ()
246
247 def __next__(self):
248 """Return the next item from the generator.
249 When exhausted, raise StopIteration.
250 """
251 return self.send(None)
252
253 @abstractmethod
254 def send(self, value):
255 """Send a value into the generator.
256 Return next yielded value or raise StopIteration.
257 """
258 raise StopIteration
259
260 @abstractmethod
261 def throw(self, typ, val=None, tb=None):
262 """Raise an exception in the generator.
263 Return next yielded value or raise StopIteration.
264 """
265 if val is None:
266 if tb is None:
267 raise typ
268 val = typ()
269 if tb is not None:
270 val = val.with_traceback(tb)
271 raise val
272
273 def close(self):
274 """Raise GeneratorExit inside generator.
275 """
276 try:
277 self.throw(GeneratorExit)
278 except (GeneratorExit, StopIteration):
279 pass
280 else:
281 raise RuntimeError("generator ignored GeneratorExit")
282
283 @classmethod
284 def __subclasshook__(cls, C):
285 if cls is Generator:
286 mro = C.__mro__
287 for method in ('__iter__', '__next__', 'send', 'throw', 'close'):
288 for base in mro:
289 if method in base.__dict__:
290 break
291 else:
292 return NotImplemented
293 return True
294 return NotImplemented
295
296
297Generator.register(generator)
298
299
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000300class Sized(metaclass=ABCMeta):
301
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700302 __slots__ = ()
303
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000304 @abstractmethod
305 def __len__(self):
306 return 0
307
308 @classmethod
309 def __subclasshook__(cls, C):
310 if cls is Sized:
311 if any("__len__" in B.__dict__ for B in C.__mro__):
312 return True
313 return NotImplemented
314
315
316class Container(metaclass=ABCMeta):
317
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700318 __slots__ = ()
319
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000320 @abstractmethod
321 def __contains__(self, x):
322 return False
323
324 @classmethod
325 def __subclasshook__(cls, C):
326 if cls is Container:
327 if any("__contains__" in B.__dict__ for B in C.__mro__):
328 return True
329 return NotImplemented
330
331
332class Callable(metaclass=ABCMeta):
333
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700334 __slots__ = ()
335
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000336 @abstractmethod
Christian Heimes78644762008-03-04 23:39:23 +0000337 def __call__(self, *args, **kwds):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000338 return False
339
340 @classmethod
341 def __subclasshook__(cls, C):
342 if cls is Callable:
343 if any("__call__" in B.__dict__ for B in C.__mro__):
344 return True
345 return NotImplemented
346
347
348### SETS ###
349
350
Raymond Hettinger74b64952008-02-09 02:53:48 +0000351class Set(Sized, Iterable, Container):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000352
353 """A set is a finite, iterable container.
354
355 This class provides concrete generic implementations of all
356 methods except for __contains__, __iter__ and __len__.
357
358 To override the comparisons (presumably for speed, as the
Raymond Hettinger11cda472014-07-03 00:31:30 +0100359 semantics are fixed), redefine __le__ and __ge__,
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000360 then the other operations will automatically follow suit.
361 """
362
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700363 __slots__ = ()
364
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000365 def __le__(self, other):
366 if not isinstance(other, Set):
367 return NotImplemented
368 if len(self) > len(other):
369 return False
370 for elem in self:
371 if elem not in other:
372 return False
373 return True
374
375 def __lt__(self, other):
376 if not isinstance(other, Set):
377 return NotImplemented
378 return len(self) < len(other) and self.__le__(other)
379
Raymond Hettinger71909422008-02-09 00:08:16 +0000380 def __gt__(self, other):
381 if not isinstance(other, Set):
382 return NotImplemented
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700383 return len(self) > len(other) and self.__ge__(other)
Raymond Hettinger71909422008-02-09 00:08:16 +0000384
385 def __ge__(self, other):
386 if not isinstance(other, Set):
387 return NotImplemented
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700388 if len(self) < len(other):
389 return False
390 for elem in other:
391 if elem not in self:
392 return False
393 return True
Raymond Hettinger71909422008-02-09 00:08:16 +0000394
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000395 def __eq__(self, other):
396 if not isinstance(other, Set):
397 return NotImplemented
398 return len(self) == len(other) and self.__le__(other)
399
400 @classmethod
401 def _from_iterable(cls, it):
Raymond Hettinger8284c4a2008-02-06 20:47:09 +0000402 '''Construct an instance of the class from any iterable input.
403
404 Must override this method if the class constructor signature
Raymond Hettinger7aebb642008-02-09 03:25:08 +0000405 does not accept an iterable for an input.
Raymond Hettinger8284c4a2008-02-06 20:47:09 +0000406 '''
Raymond Hettinger7aebb642008-02-09 03:25:08 +0000407 return cls(it)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000408
409 def __and__(self, other):
410 if not isinstance(other, Iterable):
411 return NotImplemented
412 return self._from_iterable(value for value in other if value in self)
413
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700414 __rand__ = __and__
415
Christian Heimes190d79e2008-01-30 11:58:22 +0000416 def isdisjoint(self, other):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700417 'Return True if two sets have a null intersection.'
Christian Heimes190d79e2008-01-30 11:58:22 +0000418 for value in other:
419 if value in self:
420 return False
421 return True
422
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000423 def __or__(self, other):
424 if not isinstance(other, Iterable):
425 return NotImplemented
Christian Heimes78644762008-03-04 23:39:23 +0000426 chain = (e for s in (self, other) for e in s)
427 return self._from_iterable(chain)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000428
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700429 __ror__ = __or__
430
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000431 def __sub__(self, other):
432 if not isinstance(other, Set):
433 if not isinstance(other, Iterable):
434 return NotImplemented
435 other = self._from_iterable(other)
436 return self._from_iterable(value for value in self
437 if value not in other)
438
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700439 def __rsub__(self, other):
440 if not isinstance(other, Set):
441 if not isinstance(other, Iterable):
442 return NotImplemented
443 other = self._from_iterable(other)
444 return self._from_iterable(value for value in other
445 if value not in self)
446
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000447 def __xor__(self, other):
448 if not isinstance(other, Set):
449 if not isinstance(other, Iterable):
450 return NotImplemented
451 other = self._from_iterable(other)
452 return (self - other) | (other - self)
453
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700454 __rxor__ = __xor__
455
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000456 def _hash(self):
457 """Compute the hash value of a set.
458
459 Note that we don't define __hash__: not all sets are hashable.
460 But if you define a hashable set type, its __hash__ should
461 call this function.
462
463 This must be compatible __eq__.
464
465 All sets ought to compare equal if they contain the same
466 elements, regardless of how they are implemented, and
467 regardless of the order of the elements; so there's not much
468 freedom for __eq__ or __hash__. We match the algorithm used
469 by the built-in frozenset type.
470 """
Christian Heimesa37d4c62007-12-04 23:02:19 +0000471 MAX = sys.maxsize
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000472 MASK = 2 * MAX + 1
473 n = len(self)
474 h = 1927868237 * (n + 1)
475 h &= MASK
476 for x in self:
477 hx = hash(x)
478 h ^= (hx ^ (hx << 16) ^ 89869747) * 3644798167
479 h &= MASK
480 h = h * 69069 + 907133923
481 h &= MASK
482 if h > MAX:
483 h -= MASK + 1
484 if h == -1:
485 h = 590923713
486 return h
487
488Set.register(frozenset)
489
490
491class MutableSet(Set):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700492 """A mutable set is a finite, iterable container.
493
494 This class provides concrete generic implementations of all
495 methods except for __contains__, __iter__, __len__,
496 add(), and discard().
497
498 To override the comparisons (presumably for speed, as the
499 semantics are fixed), all you have to do is redefine __le__ and
500 then the other operations will automatically follow suit.
501 """
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000502
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700503 __slots__ = ()
504
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000505 @abstractmethod
506 def add(self, value):
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000507 """Add an element."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000508 raise NotImplementedError
509
510 @abstractmethod
511 def discard(self, value):
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000512 """Remove an element. Do not raise an exception if absent."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000513 raise NotImplementedError
514
Christian Heimes190d79e2008-01-30 11:58:22 +0000515 def remove(self, value):
516 """Remove an element. If not a member, raise a KeyError."""
517 if value not in self:
518 raise KeyError(value)
519 self.discard(value)
520
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000521 def pop(self):
522 """Return the popped value. Raise KeyError if empty."""
523 it = iter(self)
524 try:
Raymond Hettingerae650182009-01-28 23:33:59 +0000525 value = next(it)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000526 except StopIteration:
527 raise KeyError
528 self.discard(value)
529 return value
530
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000531 def clear(self):
532 """This is slow (creates N new iterators!) but effective."""
533 try:
534 while True:
535 self.pop()
536 except KeyError:
537 pass
538
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000539 def __ior__(self, it):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000540 for value in it:
541 self.add(value)
542 return self
543
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000544 def __iand__(self, it):
Raymond Hettinger3f10a952009-04-01 19:05:50 +0000545 for value in (self - it):
546 self.discard(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000547 return self
548
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000549 def __ixor__(self, it):
Daniel Stutzbach31da5b22010-08-24 20:49:57 +0000550 if it is self:
551 self.clear()
552 else:
553 if not isinstance(it, Set):
554 it = self._from_iterable(it)
555 for value in it:
556 if value in self:
557 self.discard(value)
558 else:
559 self.add(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000560 return self
561
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000562 def __isub__(self, it):
Daniel Stutzbach31da5b22010-08-24 20:49:57 +0000563 if it is self:
564 self.clear()
565 else:
566 for value in it:
567 self.discard(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000568 return self
569
570MutableSet.register(set)
571
572
573### MAPPINGS ###
574
575
Raymond Hettinger74b64952008-02-09 02:53:48 +0000576class Mapping(Sized, Iterable, Container):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000577
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700578 __slots__ = ()
579
Raymond Hettinger153866e2013-03-24 15:20:29 -0700580 """A Mapping is a generic container for associating key/value
581 pairs.
582
583 This class provides concrete generic implementations of all
584 methods except for __getitem__, __iter__, and __len__.
585
586 """
587
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000588 @abstractmethod
589 def __getitem__(self, key):
590 raise KeyError
591
592 def get(self, key, default=None):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700593 'D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000594 try:
595 return self[key]
596 except KeyError:
597 return default
598
599 def __contains__(self, key):
600 try:
601 self[key]
602 except KeyError:
603 return False
604 else:
605 return True
606
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000607 def keys(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700608 "D.keys() -> a set-like object providing a view on D's keys"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000609 return KeysView(self)
610
611 def items(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700612 "D.items() -> a set-like object providing a view on D's items"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000613 return ItemsView(self)
614
615 def values(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700616 "D.values() -> an object providing a view on D's values"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000617 return ValuesView(self)
618
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000619 def __eq__(self, other):
Benjamin Peterson4ad6bd52010-05-21 20:55:22 +0000620 if not isinstance(other, Mapping):
621 return NotImplemented
622 return dict(self.items()) == dict(other.items())
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000623
Victor Stinner7b17a4e2012-04-20 01:41:36 +0200624Mapping.register(mappingproxy)
625
Christian Heimes2202f872008-02-06 14:31:34 +0000626
Raymond Hettingerbfd06122008-02-09 10:04:32 +0000627class MappingView(Sized):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000628
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700629 __slots__ = '_mapping',
630
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000631 def __init__(self, mapping):
632 self._mapping = mapping
633
634 def __len__(self):
635 return len(self._mapping)
636
Raymond Hettinger89fc2b72009-02-27 07:47:32 +0000637 def __repr__(self):
638 return '{0.__class__.__name__}({0._mapping!r})'.format(self)
639
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000640
641class KeysView(MappingView, Set):
642
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700643 __slots__ = ()
644
Raymond Hettinger9117c752010-08-22 07:44:24 +0000645 @classmethod
646 def _from_iterable(self, it):
647 return set(it)
648
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000649 def __contains__(self, key):
650 return key in self._mapping
651
652 def __iter__(self):
Philip Jenvey4993cc02012-10-01 12:53:43 -0700653 yield from self._mapping
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000654
Christian Heimesf83be4e2007-11-28 09:44:38 +0000655KeysView.register(dict_keys)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000656
657
658class ItemsView(MappingView, Set):
659
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700660 __slots__ = ()
661
Raymond Hettinger9117c752010-08-22 07:44:24 +0000662 @classmethod
663 def _from_iterable(self, it):
664 return set(it)
665
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000666 def __contains__(self, item):
667 key, value = item
668 try:
669 v = self._mapping[key]
670 except KeyError:
671 return False
672 else:
673 return v == value
674
675 def __iter__(self):
676 for key in self._mapping:
677 yield (key, self._mapping[key])
678
Christian Heimesf83be4e2007-11-28 09:44:38 +0000679ItemsView.register(dict_items)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000680
681
682class ValuesView(MappingView):
683
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700684 __slots__ = ()
685
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000686 def __contains__(self, value):
687 for key in self._mapping:
688 if value == self._mapping[key]:
689 return True
690 return False
691
692 def __iter__(self):
693 for key in self._mapping:
694 yield self._mapping[key]
695
Christian Heimesf83be4e2007-11-28 09:44:38 +0000696ValuesView.register(dict_values)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000697
698
699class MutableMapping(Mapping):
700
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700701 __slots__ = ()
702
Raymond Hettinger153866e2013-03-24 15:20:29 -0700703 """A MutableMapping is a generic container for associating
704 key/value pairs.
705
706 This class provides concrete generic implementations of all
707 methods except for __getitem__, __setitem__, __delitem__,
708 __iter__, and __len__.
709
710 """
711
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000712 @abstractmethod
713 def __setitem__(self, key, value):
714 raise KeyError
715
716 @abstractmethod
717 def __delitem__(self, key):
718 raise KeyError
719
720 __marker = object()
721
722 def pop(self, key, default=__marker):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700723 '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
724 If key is not found, d is returned if given, otherwise KeyError is raised.
725 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000726 try:
727 value = self[key]
728 except KeyError:
729 if default is self.__marker:
730 raise
731 return default
732 else:
733 del self[key]
734 return value
735
736 def popitem(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700737 '''D.popitem() -> (k, v), remove and return some (key, value) pair
738 as a 2-tuple; but raise KeyError if D is empty.
739 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000740 try:
741 key = next(iter(self))
742 except StopIteration:
743 raise KeyError
744 value = self[key]
745 del self[key]
746 return key, value
747
748 def clear(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700749 'D.clear() -> None. Remove all items from D.'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000750 try:
751 while True:
752 self.popitem()
753 except KeyError:
754 pass
755
Mark Dickinsonb214e902010-07-11 18:53:06 +0000756 def update(*args, **kwds):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700757 ''' D.update([E, ]**F) -> None. Update D from mapping/iterable E and F.
758 If E present and has a .keys() method, does: for k in E: D[k] = E[k]
759 If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v
760 In either case, this is followed by: for k, v in F.items(): D[k] = v
761 '''
Serhiy Storchakaae5cb212014-11-27 16:25:51 +0200762 if not args:
763 raise TypeError("descriptor 'update' of 'MutableMapping' object "
764 "needs an argument")
765 self, *args = args
766 if len(args) > 1:
767 raise TypeError('update expected at most 1 arguments, got %d' %
768 len(args))
769 if args:
770 other = args[0]
771 if isinstance(other, Mapping):
772 for key in other:
773 self[key] = other[key]
774 elif hasattr(other, "keys"):
775 for key in other.keys():
776 self[key] = other[key]
777 else:
778 for key, value in other:
779 self[key] = value
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000780 for key, value in kwds.items():
781 self[key] = value
782
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000783 def setdefault(self, key, default=None):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700784 '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 +0000785 try:
786 return self[key]
787 except KeyError:
788 self[key] = default
789 return default
790
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000791MutableMapping.register(dict)
792
793
794### SEQUENCES ###
795
796
Raymond Hettinger74b64952008-02-09 02:53:48 +0000797class Sequence(Sized, Iterable, Container):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000798
799 """All the operations on a read-only sequence.
800
801 Concrete subclasses must override __new__ or __init__,
802 __getitem__, and __len__.
803 """
804
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700805 __slots__ = ()
806
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000807 @abstractmethod
808 def __getitem__(self, index):
809 raise IndexError
810
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000811 def __iter__(self):
812 i = 0
Raymond Hettinger71909422008-02-09 00:08:16 +0000813 try:
814 while True:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000815 v = self[i]
Raymond Hettinger71909422008-02-09 00:08:16 +0000816 yield v
817 i += 1
818 except IndexError:
819 return
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000820
821 def __contains__(self, value):
822 for v in self:
823 if v == value:
824 return True
825 return False
826
827 def __reversed__(self):
828 for i in reversed(range(len(self))):
829 yield self[i]
830
Raymond Hettingerec219ba2015-05-22 19:29:22 -0700831 def index(self, value, start=0, stop=None):
832 '''S.index(value, [start, [stop]]) -> integer -- return first index of value.
Raymond Hettinger153866e2013-03-24 15:20:29 -0700833 Raises ValueError if the value is not present.
834 '''
Raymond Hettingerec219ba2015-05-22 19:29:22 -0700835 if start is not None and start < 0:
836 start = max(len(self) + start, 0)
837 if stop is not None and stop < 0:
838 stop += len(self)
839
840 i = start
841 while stop is None or i < stop:
842 try:
843 if self[i] == value:
844 return i
845 except IndexError:
846 break
847 i += 1
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000848 raise ValueError
849
850 def count(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700851 'S.count(value) -> integer -- return number of occurrences of value'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000852 return sum(1 for v in self if v == value)
853
854Sequence.register(tuple)
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000855Sequence.register(str)
Raymond Hettinger9aa53c22009-02-24 11:25:35 +0000856Sequence.register(range)
Nick Coghlan45163cc2013-10-02 22:31:47 +1000857Sequence.register(memoryview)
Guido van Rossumd05eb002007-11-21 22:26:24 +0000858
859
860class ByteString(Sequence):
861
862 """This unifies bytes and bytearray.
863
864 XXX Should add all their methods.
865 """
866
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700867 __slots__ = ()
868
Guido van Rossumd05eb002007-11-21 22:26:24 +0000869ByteString.register(bytes)
870ByteString.register(bytearray)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000871
872
873class MutableSequence(Sequence):
874
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700875 __slots__ = ()
876
Guido van Rossum840c3102013-07-25 11:55:41 -0700877 """All the operations on a read-write sequence.
Raymond Hettinger153866e2013-03-24 15:20:29 -0700878
879 Concrete subclasses must provide __new__ or __init__,
880 __getitem__, __setitem__, __delitem__, __len__, and insert().
881
882 """
883
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000884 @abstractmethod
885 def __setitem__(self, index, value):
886 raise IndexError
887
888 @abstractmethod
889 def __delitem__(self, index):
890 raise IndexError
891
892 @abstractmethod
893 def insert(self, index, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700894 'S.insert(index, value) -- insert value before index'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000895 raise IndexError
896
897 def append(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700898 'S.append(value) -- append value to the end of the sequence'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000899 self.insert(len(self), value)
900
Eli Bendersky9479d1a2011-03-04 05:34:58 +0000901 def clear(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700902 'S.clear() -> None -- remove all items from S'
Eli Bendersky9479d1a2011-03-04 05:34:58 +0000903 try:
904 while True:
905 self.pop()
906 except IndexError:
907 pass
908
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000909 def reverse(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700910 'S.reverse() -- reverse *IN PLACE*'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000911 n = len(self)
912 for i in range(n//2):
913 self[i], self[n-i-1] = self[n-i-1], self[i]
914
915 def extend(self, values):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700916 'S.extend(iterable) -- extend sequence by appending elements from the iterable'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000917 for v in values:
918 self.append(v)
919
920 def pop(self, index=-1):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700921 '''S.pop([index]) -> item -- remove and return item at index (default last).
922 Raise IndexError if list is empty or index is out of range.
923 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000924 v = self[index]
925 del self[index]
926 return v
927
928 def remove(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700929 '''S.remove(value) -- remove first occurrence of value.
930 Raise ValueError if the value is not present.
931 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000932 del self[self.index(value)]
933
934 def __iadd__(self, values):
935 self.extend(values)
Raymond Hettingerc384b222009-05-18 15:35:26 +0000936 return self
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000937
938MutableSequence.register(list)
Guido van Rossumd05eb002007-11-21 22:26:24 +0000939MutableSequence.register(bytearray) # Multiply inheriting, see ByteString