blob: a02b219861e578802778534c60249a2d30890279 [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))())
Christian Heimesf83be4e2007-11-28 09:44:38 +000055
56
Guido van Rossumcd16bf62007-06-13 18:07:49 +000057### ONE-TRICK PONIES ###
58
59class Hashable(metaclass=ABCMeta):
60
Raymond Hettingerc46759a2011-03-22 11:46:25 -070061 __slots__ = ()
62
Guido van Rossumcd16bf62007-06-13 18:07:49 +000063 @abstractmethod
64 def __hash__(self):
65 return 0
66
67 @classmethod
68 def __subclasshook__(cls, C):
69 if cls is Hashable:
70 for B in C.__mro__:
71 if "__hash__" in B.__dict__:
72 if B.__dict__["__hash__"]:
73 return True
74 break
75 return NotImplemented
76
77
Yury Selivanov56fc6142015-05-29 09:01:29 -040078class _AwaitableMeta(ABCMeta):
Yury Selivanov75445082015-05-11 22:57:16 -040079
80 def __instancecheck__(cls, instance):
81 # 0x80 = CO_COROUTINE
82 # 0x100 = CO_ITERABLE_COROUTINE
83 # We don't want to import 'inspect' module, as
84 # a dependency for 'collections.abc'.
85 CO_COROUTINES = 0x80 | 0x100
86
87 if (isinstance(instance, generator) and
88 instance.gi_code.co_flags & CO_COROUTINES):
89
90 return True
91
92 return super().__instancecheck__(instance)
93
94
Yury Selivanov56fc6142015-05-29 09:01:29 -040095class Awaitable(metaclass=_AwaitableMeta):
96
97 __slots__ = ()
98
99 @abstractmethod
100 def __await__(self):
101 yield
102
103 @classmethod
104 def __subclasshook__(cls, C):
105 if cls is Awaitable:
106 for B in C.__mro__:
107 if "__await__" in B.__dict__:
108 if B.__dict__["__await__"]:
109 return True
110 break
111 return NotImplemented
112
113
114class Coroutine(Awaitable):
Yury Selivanov75445082015-05-11 22:57:16 -0400115
116 __slots__ = ()
117
118 @abstractmethod
119 def send(self, value):
120 """Send a value into the coroutine.
121 Return next yielded value or raise StopIteration.
122 """
123 raise StopIteration
124
125 @abstractmethod
126 def throw(self, typ, val=None, tb=None):
127 """Raise an exception in the coroutine.
128 Return next yielded value or raise StopIteration.
129 """
130 if val is None:
131 if tb is None:
132 raise typ
133 val = typ()
134 if tb is not None:
135 val = val.with_traceback(tb)
136 raise val
137
138 def close(self):
139 """Raise GeneratorExit inside coroutine.
140 """
141 try:
142 self.throw(GeneratorExit)
143 except (GeneratorExit, StopIteration):
144 pass
145 else:
146 raise RuntimeError("coroutine ignored GeneratorExit")
147
Yury Selivanov75445082015-05-11 22:57:16 -0400148 @classmethod
149 def __subclasshook__(cls, C):
Yury Selivanov56fc6142015-05-29 09:01:29 -0400150 if cls is Coroutine:
151 mro = C.__mro__
152 for method in ('__await__', 'send', 'throw', 'close'):
153 for base in mro:
154 if method in base.__dict__:
155 break
156 else:
157 return NotImplemented
158 return True
Yury Selivanov75445082015-05-11 22:57:16 -0400159 return NotImplemented
160
Yury Selivanov75445082015-05-11 22:57:16 -0400161
Yury Selivanove0104ae2015-05-14 12:19:16 -0400162class AsyncIterable(metaclass=ABCMeta):
163
164 __slots__ = ()
165
166 @abstractmethod
167 async def __aiter__(self):
168 return AsyncIterator()
169
170 @classmethod
171 def __subclasshook__(cls, C):
172 if cls is AsyncIterable:
173 if any("__aiter__" in B.__dict__ for B in C.__mro__):
174 return True
175 return NotImplemented
176
177
178class AsyncIterator(AsyncIterable):
179
180 __slots__ = ()
181
182 @abstractmethod
183 async def __anext__(self):
184 """Return the next item or raise StopAsyncIteration when exhausted."""
185 raise StopAsyncIteration
186
187 async def __aiter__(self):
188 return self
189
190 @classmethod
191 def __subclasshook__(cls, C):
192 if cls is AsyncIterator:
193 if (any("__anext__" in B.__dict__ for B in C.__mro__) and
194 any("__aiter__" in B.__dict__ for B in C.__mro__)):
195 return True
196 return NotImplemented
197
198
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000199class Iterable(metaclass=ABCMeta):
200
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700201 __slots__ = ()
202
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000203 @abstractmethod
204 def __iter__(self):
205 while False:
206 yield None
207
208 @classmethod
209 def __subclasshook__(cls, C):
210 if cls is Iterable:
211 if any("__iter__" in B.__dict__ for B in C.__mro__):
212 return True
213 return NotImplemented
214
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000215
Raymond Hettinger74b64952008-02-09 02:53:48 +0000216class Iterator(Iterable):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000217
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700218 __slots__ = ()
219
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000220 @abstractmethod
221 def __next__(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700222 'Return the next item from the iterator. When exhausted, raise StopIteration'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000223 raise StopIteration
224
225 def __iter__(self):
226 return self
227
228 @classmethod
229 def __subclasshook__(cls, C):
230 if cls is Iterator:
Raymond Hettingeread22222010-11-29 03:56:12 +0000231 if (any("__next__" in B.__dict__ for B in C.__mro__) and
232 any("__iter__" in B.__dict__ for B in C.__mro__)):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000233 return True
234 return NotImplemented
235
Christian Heimesf83be4e2007-11-28 09:44:38 +0000236Iterator.register(bytes_iterator)
237Iterator.register(bytearray_iterator)
238#Iterator.register(callable_iterator)
239Iterator.register(dict_keyiterator)
240Iterator.register(dict_valueiterator)
241Iterator.register(dict_itemiterator)
242Iterator.register(list_iterator)
243Iterator.register(list_reverseiterator)
244Iterator.register(range_iterator)
245Iterator.register(set_iterator)
246Iterator.register(str_iterator)
247Iterator.register(tuple_iterator)
248Iterator.register(zip_iterator)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000249
Raymond Hettingerbd60e8d2015-05-09 01:07:23 -0400250
251class Generator(Iterator):
252
253 __slots__ = ()
254
255 def __next__(self):
256 """Return the next item from the generator.
257 When exhausted, raise StopIteration.
258 """
259 return self.send(None)
260
261 @abstractmethod
262 def send(self, value):
263 """Send a value into the generator.
264 Return next yielded value or raise StopIteration.
265 """
266 raise StopIteration
267
268 @abstractmethod
269 def throw(self, typ, val=None, tb=None):
270 """Raise an exception in the generator.
271 Return next yielded value or raise StopIteration.
272 """
273 if val is None:
274 if tb is None:
275 raise typ
276 val = typ()
277 if tb is not None:
278 val = val.with_traceback(tb)
279 raise val
280
281 def close(self):
282 """Raise GeneratorExit inside generator.
283 """
284 try:
285 self.throw(GeneratorExit)
286 except (GeneratorExit, StopIteration):
287 pass
288 else:
289 raise RuntimeError("generator ignored GeneratorExit")
290
291 @classmethod
292 def __subclasshook__(cls, C):
293 if cls is Generator:
294 mro = C.__mro__
295 for method in ('__iter__', '__next__', 'send', 'throw', 'close'):
296 for base in mro:
297 if method in base.__dict__:
298 break
299 else:
300 return NotImplemented
301 return True
302 return NotImplemented
303
304
305Generator.register(generator)
306
307
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000308class Sized(metaclass=ABCMeta):
309
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700310 __slots__ = ()
311
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000312 @abstractmethod
313 def __len__(self):
314 return 0
315
316 @classmethod
317 def __subclasshook__(cls, C):
318 if cls is Sized:
319 if any("__len__" in B.__dict__ for B in C.__mro__):
320 return True
321 return NotImplemented
322
323
324class Container(metaclass=ABCMeta):
325
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700326 __slots__ = ()
327
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000328 @abstractmethod
329 def __contains__(self, x):
330 return False
331
332 @classmethod
333 def __subclasshook__(cls, C):
334 if cls is Container:
335 if any("__contains__" in B.__dict__ for B in C.__mro__):
336 return True
337 return NotImplemented
338
339
340class Callable(metaclass=ABCMeta):
341
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700342 __slots__ = ()
343
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000344 @abstractmethod
Christian Heimes78644762008-03-04 23:39:23 +0000345 def __call__(self, *args, **kwds):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000346 return False
347
348 @classmethod
349 def __subclasshook__(cls, C):
350 if cls is Callable:
351 if any("__call__" in B.__dict__ for B in C.__mro__):
352 return True
353 return NotImplemented
354
355
356### SETS ###
357
358
Raymond Hettinger74b64952008-02-09 02:53:48 +0000359class Set(Sized, Iterable, Container):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000360
361 """A set is a finite, iterable container.
362
363 This class provides concrete generic implementations of all
364 methods except for __contains__, __iter__ and __len__.
365
366 To override the comparisons (presumably for speed, as the
Raymond Hettinger11cda472014-07-03 00:31:30 +0100367 semantics are fixed), redefine __le__ and __ge__,
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000368 then the other operations will automatically follow suit.
369 """
370
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700371 __slots__ = ()
372
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000373 def __le__(self, other):
374 if not isinstance(other, Set):
375 return NotImplemented
376 if len(self) > len(other):
377 return False
378 for elem in self:
379 if elem not in other:
380 return False
381 return True
382
383 def __lt__(self, other):
384 if not isinstance(other, Set):
385 return NotImplemented
386 return len(self) < len(other) and self.__le__(other)
387
Raymond Hettinger71909422008-02-09 00:08:16 +0000388 def __gt__(self, other):
389 if not isinstance(other, Set):
390 return NotImplemented
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700391 return len(self) > len(other) and self.__ge__(other)
Raymond Hettinger71909422008-02-09 00:08:16 +0000392
393 def __ge__(self, other):
394 if not isinstance(other, Set):
395 return NotImplemented
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700396 if len(self) < len(other):
397 return False
398 for elem in other:
399 if elem not in self:
400 return False
401 return True
Raymond Hettinger71909422008-02-09 00:08:16 +0000402
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000403 def __eq__(self, other):
404 if not isinstance(other, Set):
405 return NotImplemented
406 return len(self) == len(other) and self.__le__(other)
407
408 @classmethod
409 def _from_iterable(cls, it):
Raymond Hettinger8284c4a2008-02-06 20:47:09 +0000410 '''Construct an instance of the class from any iterable input.
411
412 Must override this method if the class constructor signature
Raymond Hettinger7aebb642008-02-09 03:25:08 +0000413 does not accept an iterable for an input.
Raymond Hettinger8284c4a2008-02-06 20:47:09 +0000414 '''
Raymond Hettinger7aebb642008-02-09 03:25:08 +0000415 return cls(it)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000416
417 def __and__(self, other):
418 if not isinstance(other, Iterable):
419 return NotImplemented
420 return self._from_iterable(value for value in other if value in self)
421
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700422 __rand__ = __and__
423
Christian Heimes190d79e2008-01-30 11:58:22 +0000424 def isdisjoint(self, other):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700425 'Return True if two sets have a null intersection.'
Christian Heimes190d79e2008-01-30 11:58:22 +0000426 for value in other:
427 if value in self:
428 return False
429 return True
430
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000431 def __or__(self, other):
432 if not isinstance(other, Iterable):
433 return NotImplemented
Christian Heimes78644762008-03-04 23:39:23 +0000434 chain = (e for s in (self, other) for e in s)
435 return self._from_iterable(chain)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000436
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700437 __ror__ = __or__
438
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000439 def __sub__(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 self
445 if value not in other)
446
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700447 def __rsub__(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._from_iterable(value for value in other
453 if value not in self)
454
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000455 def __xor__(self, other):
456 if not isinstance(other, Set):
457 if not isinstance(other, Iterable):
458 return NotImplemented
459 other = self._from_iterable(other)
460 return (self - other) | (other - self)
461
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700462 __rxor__ = __xor__
463
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000464 def _hash(self):
465 """Compute the hash value of a set.
466
467 Note that we don't define __hash__: not all sets are hashable.
468 But if you define a hashable set type, its __hash__ should
469 call this function.
470
471 This must be compatible __eq__.
472
473 All sets ought to compare equal if they contain the same
474 elements, regardless of how they are implemented, and
475 regardless of the order of the elements; so there's not much
476 freedom for __eq__ or __hash__. We match the algorithm used
477 by the built-in frozenset type.
478 """
Christian Heimesa37d4c62007-12-04 23:02:19 +0000479 MAX = sys.maxsize
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000480 MASK = 2 * MAX + 1
481 n = len(self)
482 h = 1927868237 * (n + 1)
483 h &= MASK
484 for x in self:
485 hx = hash(x)
486 h ^= (hx ^ (hx << 16) ^ 89869747) * 3644798167
487 h &= MASK
488 h = h * 69069 + 907133923
489 h &= MASK
490 if h > MAX:
491 h -= MASK + 1
492 if h == -1:
493 h = 590923713
494 return h
495
496Set.register(frozenset)
497
498
499class MutableSet(Set):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700500 """A mutable set is a finite, iterable container.
501
502 This class provides concrete generic implementations of all
503 methods except for __contains__, __iter__, __len__,
504 add(), and discard().
505
506 To override the comparisons (presumably for speed, as the
507 semantics are fixed), all you have to do is redefine __le__ and
508 then the other operations will automatically follow suit.
509 """
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000510
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700511 __slots__ = ()
512
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000513 @abstractmethod
514 def add(self, value):
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000515 """Add an element."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000516 raise NotImplementedError
517
518 @abstractmethod
519 def discard(self, value):
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000520 """Remove an element. Do not raise an exception if absent."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000521 raise NotImplementedError
522
Christian Heimes190d79e2008-01-30 11:58:22 +0000523 def remove(self, value):
524 """Remove an element. If not a member, raise a KeyError."""
525 if value not in self:
526 raise KeyError(value)
527 self.discard(value)
528
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000529 def pop(self):
530 """Return the popped value. Raise KeyError if empty."""
531 it = iter(self)
532 try:
Raymond Hettingerae650182009-01-28 23:33:59 +0000533 value = next(it)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000534 except StopIteration:
535 raise KeyError
536 self.discard(value)
537 return value
538
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000539 def clear(self):
540 """This is slow (creates N new iterators!) but effective."""
541 try:
542 while True:
543 self.pop()
544 except KeyError:
545 pass
546
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000547 def __ior__(self, it):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000548 for value in it:
549 self.add(value)
550 return self
551
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000552 def __iand__(self, it):
Raymond Hettinger3f10a952009-04-01 19:05:50 +0000553 for value in (self - it):
554 self.discard(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000555 return self
556
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000557 def __ixor__(self, it):
Daniel Stutzbach31da5b22010-08-24 20:49:57 +0000558 if it is self:
559 self.clear()
560 else:
561 if not isinstance(it, Set):
562 it = self._from_iterable(it)
563 for value in it:
564 if value in self:
565 self.discard(value)
566 else:
567 self.add(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000568 return self
569
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000570 def __isub__(self, it):
Daniel Stutzbach31da5b22010-08-24 20:49:57 +0000571 if it is self:
572 self.clear()
573 else:
574 for value in it:
575 self.discard(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000576 return self
577
578MutableSet.register(set)
579
580
581### MAPPINGS ###
582
583
Raymond Hettinger74b64952008-02-09 02:53:48 +0000584class Mapping(Sized, Iterable, Container):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000585
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700586 __slots__ = ()
587
Raymond Hettinger153866e2013-03-24 15:20:29 -0700588 """A Mapping is a generic container for associating key/value
589 pairs.
590
591 This class provides concrete generic implementations of all
592 methods except for __getitem__, __iter__, and __len__.
593
594 """
595
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000596 @abstractmethod
597 def __getitem__(self, key):
598 raise KeyError
599
600 def get(self, key, default=None):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700601 'D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000602 try:
603 return self[key]
604 except KeyError:
605 return default
606
607 def __contains__(self, key):
608 try:
609 self[key]
610 except KeyError:
611 return False
612 else:
613 return True
614
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000615 def keys(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700616 "D.keys() -> a set-like object providing a view on D's keys"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000617 return KeysView(self)
618
619 def items(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700620 "D.items() -> a set-like object providing a view on D's items"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000621 return ItemsView(self)
622
623 def values(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700624 "D.values() -> an object providing a view on D's values"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000625 return ValuesView(self)
626
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000627 def __eq__(self, other):
Benjamin Peterson4ad6bd52010-05-21 20:55:22 +0000628 if not isinstance(other, Mapping):
629 return NotImplemented
630 return dict(self.items()) == dict(other.items())
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000631
Victor Stinner7b17a4e2012-04-20 01:41:36 +0200632Mapping.register(mappingproxy)
633
Christian Heimes2202f872008-02-06 14:31:34 +0000634
Raymond Hettingerbfd06122008-02-09 10:04:32 +0000635class MappingView(Sized):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000636
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700637 __slots__ = '_mapping',
638
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000639 def __init__(self, mapping):
640 self._mapping = mapping
641
642 def __len__(self):
643 return len(self._mapping)
644
Raymond Hettinger89fc2b72009-02-27 07:47:32 +0000645 def __repr__(self):
646 return '{0.__class__.__name__}({0._mapping!r})'.format(self)
647
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000648
649class KeysView(MappingView, Set):
650
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700651 __slots__ = ()
652
Raymond Hettinger9117c752010-08-22 07:44:24 +0000653 @classmethod
654 def _from_iterable(self, it):
655 return set(it)
656
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000657 def __contains__(self, key):
658 return key in self._mapping
659
660 def __iter__(self):
Philip Jenvey4993cc02012-10-01 12:53:43 -0700661 yield from self._mapping
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000662
Christian Heimesf83be4e2007-11-28 09:44:38 +0000663KeysView.register(dict_keys)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000664
665
666class ItemsView(MappingView, Set):
667
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700668 __slots__ = ()
669
Raymond Hettinger9117c752010-08-22 07:44:24 +0000670 @classmethod
671 def _from_iterable(self, it):
672 return set(it)
673
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000674 def __contains__(self, item):
675 key, value = item
676 try:
677 v = self._mapping[key]
678 except KeyError:
679 return False
680 else:
681 return v == value
682
683 def __iter__(self):
684 for key in self._mapping:
685 yield (key, self._mapping[key])
686
Christian Heimesf83be4e2007-11-28 09:44:38 +0000687ItemsView.register(dict_items)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000688
689
690class ValuesView(MappingView):
691
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700692 __slots__ = ()
693
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000694 def __contains__(self, value):
695 for key in self._mapping:
696 if value == self._mapping[key]:
697 return True
698 return False
699
700 def __iter__(self):
701 for key in self._mapping:
702 yield self._mapping[key]
703
Christian Heimesf83be4e2007-11-28 09:44:38 +0000704ValuesView.register(dict_values)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000705
706
707class MutableMapping(Mapping):
708
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700709 __slots__ = ()
710
Raymond Hettinger153866e2013-03-24 15:20:29 -0700711 """A MutableMapping is a generic container for associating
712 key/value pairs.
713
714 This class provides concrete generic implementations of all
715 methods except for __getitem__, __setitem__, __delitem__,
716 __iter__, and __len__.
717
718 """
719
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000720 @abstractmethod
721 def __setitem__(self, key, value):
722 raise KeyError
723
724 @abstractmethod
725 def __delitem__(self, key):
726 raise KeyError
727
728 __marker = object()
729
730 def pop(self, key, default=__marker):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700731 '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
732 If key is not found, d is returned if given, otherwise KeyError is raised.
733 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000734 try:
735 value = self[key]
736 except KeyError:
737 if default is self.__marker:
738 raise
739 return default
740 else:
741 del self[key]
742 return value
743
744 def popitem(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700745 '''D.popitem() -> (k, v), remove and return some (key, value) pair
746 as a 2-tuple; but raise KeyError if D is empty.
747 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000748 try:
749 key = next(iter(self))
750 except StopIteration:
751 raise KeyError
752 value = self[key]
753 del self[key]
754 return key, value
755
756 def clear(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700757 'D.clear() -> None. Remove all items from D.'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000758 try:
759 while True:
760 self.popitem()
761 except KeyError:
762 pass
763
Mark Dickinsonb214e902010-07-11 18:53:06 +0000764 def update(*args, **kwds):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700765 ''' D.update([E, ]**F) -> None. Update D from mapping/iterable E and F.
766 If E present and has a .keys() method, does: for k in E: D[k] = E[k]
767 If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v
768 In either case, this is followed by: for k, v in F.items(): D[k] = v
769 '''
Serhiy Storchakaae5cb212014-11-27 16:25:51 +0200770 if not args:
771 raise TypeError("descriptor 'update' of 'MutableMapping' object "
772 "needs an argument")
773 self, *args = args
774 if len(args) > 1:
775 raise TypeError('update expected at most 1 arguments, got %d' %
776 len(args))
777 if args:
778 other = args[0]
779 if isinstance(other, Mapping):
780 for key in other:
781 self[key] = other[key]
782 elif hasattr(other, "keys"):
783 for key in other.keys():
784 self[key] = other[key]
785 else:
786 for key, value in other:
787 self[key] = value
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000788 for key, value in kwds.items():
789 self[key] = value
790
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000791 def setdefault(self, key, default=None):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700792 '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 +0000793 try:
794 return self[key]
795 except KeyError:
796 self[key] = default
797 return default
798
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000799MutableMapping.register(dict)
800
801
802### SEQUENCES ###
803
804
Raymond Hettinger74b64952008-02-09 02:53:48 +0000805class Sequence(Sized, Iterable, Container):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000806
807 """All the operations on a read-only sequence.
808
809 Concrete subclasses must override __new__ or __init__,
810 __getitem__, and __len__.
811 """
812
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700813 __slots__ = ()
814
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000815 @abstractmethod
816 def __getitem__(self, index):
817 raise IndexError
818
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000819 def __iter__(self):
820 i = 0
Raymond Hettinger71909422008-02-09 00:08:16 +0000821 try:
822 while True:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000823 v = self[i]
Raymond Hettinger71909422008-02-09 00:08:16 +0000824 yield v
825 i += 1
826 except IndexError:
827 return
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000828
829 def __contains__(self, value):
830 for v in self:
831 if v == value:
832 return True
833 return False
834
835 def __reversed__(self):
836 for i in reversed(range(len(self))):
837 yield self[i]
838
Raymond Hettingerec219ba2015-05-22 19:29:22 -0700839 def index(self, value, start=0, stop=None):
840 '''S.index(value, [start, [stop]]) -> integer -- return first index of value.
Raymond Hettinger153866e2013-03-24 15:20:29 -0700841 Raises ValueError if the value is not present.
842 '''
Raymond Hettingerec219ba2015-05-22 19:29:22 -0700843 if start is not None and start < 0:
844 start = max(len(self) + start, 0)
845 if stop is not None and stop < 0:
846 stop += len(self)
847
848 i = start
849 while stop is None or i < stop:
850 try:
851 if self[i] == value:
852 return i
853 except IndexError:
854 break
855 i += 1
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000856 raise ValueError
857
858 def count(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700859 'S.count(value) -> integer -- return number of occurrences of value'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000860 return sum(1 for v in self if v == value)
861
862Sequence.register(tuple)
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000863Sequence.register(str)
Raymond Hettinger9aa53c22009-02-24 11:25:35 +0000864Sequence.register(range)
Nick Coghlan45163cc2013-10-02 22:31:47 +1000865Sequence.register(memoryview)
Guido van Rossumd05eb002007-11-21 22:26:24 +0000866
867
868class ByteString(Sequence):
869
870 """This unifies bytes and bytearray.
871
872 XXX Should add all their methods.
873 """
874
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700875 __slots__ = ()
876
Guido van Rossumd05eb002007-11-21 22:26:24 +0000877ByteString.register(bytes)
878ByteString.register(bytearray)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000879
880
881class MutableSequence(Sequence):
882
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700883 __slots__ = ()
884
Guido van Rossum840c3102013-07-25 11:55:41 -0700885 """All the operations on a read-write sequence.
Raymond Hettinger153866e2013-03-24 15:20:29 -0700886
887 Concrete subclasses must provide __new__ or __init__,
888 __getitem__, __setitem__, __delitem__, __len__, and insert().
889
890 """
891
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000892 @abstractmethod
893 def __setitem__(self, index, value):
894 raise IndexError
895
896 @abstractmethod
897 def __delitem__(self, index):
898 raise IndexError
899
900 @abstractmethod
901 def insert(self, index, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700902 'S.insert(index, value) -- insert value before index'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000903 raise IndexError
904
905 def append(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700906 'S.append(value) -- append value to the end of the sequence'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000907 self.insert(len(self), value)
908
Eli Bendersky9479d1a2011-03-04 05:34:58 +0000909 def clear(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700910 'S.clear() -> None -- remove all items from S'
Eli Bendersky9479d1a2011-03-04 05:34:58 +0000911 try:
912 while True:
913 self.pop()
914 except IndexError:
915 pass
916
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000917 def reverse(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700918 'S.reverse() -- reverse *IN PLACE*'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000919 n = len(self)
920 for i in range(n//2):
921 self[i], self[n-i-1] = self[n-i-1], self[i]
922
923 def extend(self, values):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700924 'S.extend(iterable) -- extend sequence by appending elements from the iterable'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000925 for v in values:
926 self.append(v)
927
928 def pop(self, index=-1):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700929 '''S.pop([index]) -> item -- remove and return item at index (default last).
930 Raise IndexError if list is empty or index is out of range.
931 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000932 v = self[index]
933 del self[index]
934 return v
935
936 def remove(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700937 '''S.remove(value) -- remove first occurrence of value.
938 Raise ValueError if the value is not present.
939 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000940 del self[self.index(value)]
941
942 def __iadd__(self, values):
943 self.extend(values)
Raymond Hettingerc384b222009-05-18 15:35:26 +0000944 return self
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000945
946MutableSequence.register(list)
Guido van Rossumd05eb002007-11-21 22:26:24 +0000947MutableSequence.register(bytearray) # Multiply inheriting, see ByteString