blob: 0ca7debddb1378b2cee61807057c963e66b542b4 [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 Selivanov75445082015-05-11 22:57:16 -040078class _CoroutineMeta(ABCMeta):
79
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
95class Coroutine(metaclass=_CoroutineMeta):
96
97 __slots__ = ()
98
99 @abstractmethod
100 def send(self, value):
101 """Send a value into the coroutine.
102 Return next yielded value or raise StopIteration.
103 """
104 raise StopIteration
105
106 @abstractmethod
107 def throw(self, typ, val=None, tb=None):
108 """Raise an exception in the coroutine.
109 Return next yielded value or raise StopIteration.
110 """
111 if val is None:
112 if tb is None:
113 raise typ
114 val = typ()
115 if tb is not None:
116 val = val.with_traceback(tb)
117 raise val
118
119 def close(self):
120 """Raise GeneratorExit inside coroutine.
121 """
122 try:
123 self.throw(GeneratorExit)
124 except (GeneratorExit, StopIteration):
125 pass
126 else:
127 raise RuntimeError("coroutine ignored GeneratorExit")
128
129
130class Awaitable(metaclass=_CoroutineMeta):
131
132 __slots__ = ()
133
134 @abstractmethod
135 def __await__(self):
136 yield
137
138 @classmethod
139 def __subclasshook__(cls, C):
140 if cls is Awaitable:
141 for B in C.__mro__:
142 if "__await__" in B.__dict__:
143 if B.__dict__["__await__"]:
144 return True
145 break
146 return NotImplemented
147
148Awaitable.register(Coroutine)
149
150
Yury Selivanove0104ae2015-05-14 12:19:16 -0400151class AsyncIterable(metaclass=ABCMeta):
152
153 __slots__ = ()
154
155 @abstractmethod
156 async def __aiter__(self):
157 return AsyncIterator()
158
159 @classmethod
160 def __subclasshook__(cls, C):
161 if cls is AsyncIterable:
162 if any("__aiter__" in B.__dict__ for B in C.__mro__):
163 return True
164 return NotImplemented
165
166
167class AsyncIterator(AsyncIterable):
168
169 __slots__ = ()
170
171 @abstractmethod
172 async def __anext__(self):
173 """Return the next item or raise StopAsyncIteration when exhausted."""
174 raise StopAsyncIteration
175
176 async def __aiter__(self):
177 return self
178
179 @classmethod
180 def __subclasshook__(cls, C):
181 if cls is AsyncIterator:
182 if (any("__anext__" in B.__dict__ for B in C.__mro__) and
183 any("__aiter__" in B.__dict__ for B in C.__mro__)):
184 return True
185 return NotImplemented
186
187
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000188class Iterable(metaclass=ABCMeta):
189
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700190 __slots__ = ()
191
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000192 @abstractmethod
193 def __iter__(self):
194 while False:
195 yield None
196
197 @classmethod
198 def __subclasshook__(cls, C):
199 if cls is Iterable:
200 if any("__iter__" in B.__dict__ for B in C.__mro__):
201 return True
202 return NotImplemented
203
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000204
Raymond Hettinger74b64952008-02-09 02:53:48 +0000205class Iterator(Iterable):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000206
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700207 __slots__ = ()
208
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000209 @abstractmethod
210 def __next__(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700211 'Return the next item from the iterator. When exhausted, raise StopIteration'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000212 raise StopIteration
213
214 def __iter__(self):
215 return self
216
217 @classmethod
218 def __subclasshook__(cls, C):
219 if cls is Iterator:
Raymond Hettingeread22222010-11-29 03:56:12 +0000220 if (any("__next__" in B.__dict__ for B in C.__mro__) and
221 any("__iter__" in B.__dict__ for B in C.__mro__)):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000222 return True
223 return NotImplemented
224
Christian Heimesf83be4e2007-11-28 09:44:38 +0000225Iterator.register(bytes_iterator)
226Iterator.register(bytearray_iterator)
227#Iterator.register(callable_iterator)
228Iterator.register(dict_keyiterator)
229Iterator.register(dict_valueiterator)
230Iterator.register(dict_itemiterator)
231Iterator.register(list_iterator)
232Iterator.register(list_reverseiterator)
233Iterator.register(range_iterator)
234Iterator.register(set_iterator)
235Iterator.register(str_iterator)
236Iterator.register(tuple_iterator)
237Iterator.register(zip_iterator)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000238
Raymond Hettingerbd60e8d2015-05-09 01:07:23 -0400239
240class Generator(Iterator):
241
242 __slots__ = ()
243
244 def __next__(self):
245 """Return the next item from the generator.
246 When exhausted, raise StopIteration.
247 """
248 return self.send(None)
249
250 @abstractmethod
251 def send(self, value):
252 """Send a value into the generator.
253 Return next yielded value or raise StopIteration.
254 """
255 raise StopIteration
256
257 @abstractmethod
258 def throw(self, typ, val=None, tb=None):
259 """Raise an exception in the generator.
260 Return next yielded value or raise StopIteration.
261 """
262 if val is None:
263 if tb is None:
264 raise typ
265 val = typ()
266 if tb is not None:
267 val = val.with_traceback(tb)
268 raise val
269
270 def close(self):
271 """Raise GeneratorExit inside generator.
272 """
273 try:
274 self.throw(GeneratorExit)
275 except (GeneratorExit, StopIteration):
276 pass
277 else:
278 raise RuntimeError("generator ignored GeneratorExit")
279
280 @classmethod
281 def __subclasshook__(cls, C):
282 if cls is Generator:
283 mro = C.__mro__
284 for method in ('__iter__', '__next__', 'send', 'throw', 'close'):
285 for base in mro:
286 if method in base.__dict__:
287 break
288 else:
289 return NotImplemented
290 return True
291 return NotImplemented
292
293
294Generator.register(generator)
295
296
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000297class Sized(metaclass=ABCMeta):
298
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700299 __slots__ = ()
300
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000301 @abstractmethod
302 def __len__(self):
303 return 0
304
305 @classmethod
306 def __subclasshook__(cls, C):
307 if cls is Sized:
308 if any("__len__" in B.__dict__ for B in C.__mro__):
309 return True
310 return NotImplemented
311
312
313class Container(metaclass=ABCMeta):
314
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700315 __slots__ = ()
316
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000317 @abstractmethod
318 def __contains__(self, x):
319 return False
320
321 @classmethod
322 def __subclasshook__(cls, C):
323 if cls is Container:
324 if any("__contains__" in B.__dict__ for B in C.__mro__):
325 return True
326 return NotImplemented
327
328
329class Callable(metaclass=ABCMeta):
330
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700331 __slots__ = ()
332
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000333 @abstractmethod
Christian Heimes78644762008-03-04 23:39:23 +0000334 def __call__(self, *args, **kwds):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000335 return False
336
337 @classmethod
338 def __subclasshook__(cls, C):
339 if cls is Callable:
340 if any("__call__" in B.__dict__ for B in C.__mro__):
341 return True
342 return NotImplemented
343
344
345### SETS ###
346
347
Raymond Hettinger74b64952008-02-09 02:53:48 +0000348class Set(Sized, Iterable, Container):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000349
350 """A set is a finite, iterable container.
351
352 This class provides concrete generic implementations of all
353 methods except for __contains__, __iter__ and __len__.
354
355 To override the comparisons (presumably for speed, as the
Raymond Hettinger11cda472014-07-03 00:31:30 +0100356 semantics are fixed), redefine __le__ and __ge__,
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000357 then the other operations will automatically follow suit.
358 """
359
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700360 __slots__ = ()
361
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000362 def __le__(self, other):
363 if not isinstance(other, Set):
364 return NotImplemented
365 if len(self) > len(other):
366 return False
367 for elem in self:
368 if elem not in other:
369 return False
370 return True
371
372 def __lt__(self, other):
373 if not isinstance(other, Set):
374 return NotImplemented
375 return len(self) < len(other) and self.__le__(other)
376
Raymond Hettinger71909422008-02-09 00:08:16 +0000377 def __gt__(self, other):
378 if not isinstance(other, Set):
379 return NotImplemented
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700380 return len(self) > len(other) and self.__ge__(other)
Raymond Hettinger71909422008-02-09 00:08:16 +0000381
382 def __ge__(self, other):
383 if not isinstance(other, Set):
384 return NotImplemented
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700385 if len(self) < len(other):
386 return False
387 for elem in other:
388 if elem not in self:
389 return False
390 return True
Raymond Hettinger71909422008-02-09 00:08:16 +0000391
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000392 def __eq__(self, other):
393 if not isinstance(other, Set):
394 return NotImplemented
395 return len(self) == len(other) and self.__le__(other)
396
397 @classmethod
398 def _from_iterable(cls, it):
Raymond Hettinger8284c4a2008-02-06 20:47:09 +0000399 '''Construct an instance of the class from any iterable input.
400
401 Must override this method if the class constructor signature
Raymond Hettinger7aebb642008-02-09 03:25:08 +0000402 does not accept an iterable for an input.
Raymond Hettinger8284c4a2008-02-06 20:47:09 +0000403 '''
Raymond Hettinger7aebb642008-02-09 03:25:08 +0000404 return cls(it)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000405
406 def __and__(self, other):
407 if not isinstance(other, Iterable):
408 return NotImplemented
409 return self._from_iterable(value for value in other if value in self)
410
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700411 __rand__ = __and__
412
Christian Heimes190d79e2008-01-30 11:58:22 +0000413 def isdisjoint(self, other):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700414 'Return True if two sets have a null intersection.'
Christian Heimes190d79e2008-01-30 11:58:22 +0000415 for value in other:
416 if value in self:
417 return False
418 return True
419
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000420 def __or__(self, other):
421 if not isinstance(other, Iterable):
422 return NotImplemented
Christian Heimes78644762008-03-04 23:39:23 +0000423 chain = (e for s in (self, other) for e in s)
424 return self._from_iterable(chain)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000425
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700426 __ror__ = __or__
427
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000428 def __sub__(self, other):
429 if not isinstance(other, Set):
430 if not isinstance(other, Iterable):
431 return NotImplemented
432 other = self._from_iterable(other)
433 return self._from_iterable(value for value in self
434 if value not in other)
435
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700436 def __rsub__(self, other):
437 if not isinstance(other, Set):
438 if not isinstance(other, Iterable):
439 return NotImplemented
440 other = self._from_iterable(other)
441 return self._from_iterable(value for value in other
442 if value not in self)
443
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000444 def __xor__(self, other):
445 if not isinstance(other, Set):
446 if not isinstance(other, Iterable):
447 return NotImplemented
448 other = self._from_iterable(other)
449 return (self - other) | (other - self)
450
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700451 __rxor__ = __xor__
452
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000453 def _hash(self):
454 """Compute the hash value of a set.
455
456 Note that we don't define __hash__: not all sets are hashable.
457 But if you define a hashable set type, its __hash__ should
458 call this function.
459
460 This must be compatible __eq__.
461
462 All sets ought to compare equal if they contain the same
463 elements, regardless of how they are implemented, and
464 regardless of the order of the elements; so there's not much
465 freedom for __eq__ or __hash__. We match the algorithm used
466 by the built-in frozenset type.
467 """
Christian Heimesa37d4c62007-12-04 23:02:19 +0000468 MAX = sys.maxsize
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000469 MASK = 2 * MAX + 1
470 n = len(self)
471 h = 1927868237 * (n + 1)
472 h &= MASK
473 for x in self:
474 hx = hash(x)
475 h ^= (hx ^ (hx << 16) ^ 89869747) * 3644798167
476 h &= MASK
477 h = h * 69069 + 907133923
478 h &= MASK
479 if h > MAX:
480 h -= MASK + 1
481 if h == -1:
482 h = 590923713
483 return h
484
485Set.register(frozenset)
486
487
488class MutableSet(Set):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700489 """A mutable set is a finite, iterable container.
490
491 This class provides concrete generic implementations of all
492 methods except for __contains__, __iter__, __len__,
493 add(), and discard().
494
495 To override the comparisons (presumably for speed, as the
496 semantics are fixed), all you have to do is redefine __le__ and
497 then the other operations will automatically follow suit.
498 """
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000499
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700500 __slots__ = ()
501
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000502 @abstractmethod
503 def add(self, value):
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000504 """Add an element."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000505 raise NotImplementedError
506
507 @abstractmethod
508 def discard(self, value):
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000509 """Remove an element. Do not raise an exception if absent."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000510 raise NotImplementedError
511
Christian Heimes190d79e2008-01-30 11:58:22 +0000512 def remove(self, value):
513 """Remove an element. If not a member, raise a KeyError."""
514 if value not in self:
515 raise KeyError(value)
516 self.discard(value)
517
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000518 def pop(self):
519 """Return the popped value. Raise KeyError if empty."""
520 it = iter(self)
521 try:
Raymond Hettingerae650182009-01-28 23:33:59 +0000522 value = next(it)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000523 except StopIteration:
524 raise KeyError
525 self.discard(value)
526 return value
527
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000528 def clear(self):
529 """This is slow (creates N new iterators!) but effective."""
530 try:
531 while True:
532 self.pop()
533 except KeyError:
534 pass
535
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000536 def __ior__(self, it):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000537 for value in it:
538 self.add(value)
539 return self
540
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000541 def __iand__(self, it):
Raymond Hettinger3f10a952009-04-01 19:05:50 +0000542 for value in (self - it):
543 self.discard(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000544 return self
545
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000546 def __ixor__(self, it):
Daniel Stutzbach31da5b22010-08-24 20:49:57 +0000547 if it is self:
548 self.clear()
549 else:
550 if not isinstance(it, Set):
551 it = self._from_iterable(it)
552 for value in it:
553 if value in self:
554 self.discard(value)
555 else:
556 self.add(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000557 return self
558
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000559 def __isub__(self, it):
Daniel Stutzbach31da5b22010-08-24 20:49:57 +0000560 if it is self:
561 self.clear()
562 else:
563 for value in it:
564 self.discard(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000565 return self
566
567MutableSet.register(set)
568
569
570### MAPPINGS ###
571
572
Raymond Hettinger74b64952008-02-09 02:53:48 +0000573class Mapping(Sized, Iterable, Container):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000574
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700575 __slots__ = ()
576
Raymond Hettinger153866e2013-03-24 15:20:29 -0700577 """A Mapping is a generic container for associating key/value
578 pairs.
579
580 This class provides concrete generic implementations of all
581 methods except for __getitem__, __iter__, and __len__.
582
583 """
584
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000585 @abstractmethod
586 def __getitem__(self, key):
587 raise KeyError
588
589 def get(self, key, default=None):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700590 'D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000591 try:
592 return self[key]
593 except KeyError:
594 return default
595
596 def __contains__(self, key):
597 try:
598 self[key]
599 except KeyError:
600 return False
601 else:
602 return True
603
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000604 def keys(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700605 "D.keys() -> a set-like object providing a view on D's keys"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000606 return KeysView(self)
607
608 def items(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700609 "D.items() -> a set-like object providing a view on D's items"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000610 return ItemsView(self)
611
612 def values(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700613 "D.values() -> an object providing a view on D's values"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000614 return ValuesView(self)
615
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000616 def __eq__(self, other):
Benjamin Peterson4ad6bd52010-05-21 20:55:22 +0000617 if not isinstance(other, Mapping):
618 return NotImplemented
619 return dict(self.items()) == dict(other.items())
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000620
Victor Stinner7b17a4e2012-04-20 01:41:36 +0200621Mapping.register(mappingproxy)
622
Christian Heimes2202f872008-02-06 14:31:34 +0000623
Raymond Hettingerbfd06122008-02-09 10:04:32 +0000624class MappingView(Sized):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000625
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700626 __slots__ = '_mapping',
627
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000628 def __init__(self, mapping):
629 self._mapping = mapping
630
631 def __len__(self):
632 return len(self._mapping)
633
Raymond Hettinger89fc2b72009-02-27 07:47:32 +0000634 def __repr__(self):
635 return '{0.__class__.__name__}({0._mapping!r})'.format(self)
636
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000637
638class KeysView(MappingView, Set):
639
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700640 __slots__ = ()
641
Raymond Hettinger9117c752010-08-22 07:44:24 +0000642 @classmethod
643 def _from_iterable(self, it):
644 return set(it)
645
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000646 def __contains__(self, key):
647 return key in self._mapping
648
649 def __iter__(self):
Philip Jenvey4993cc02012-10-01 12:53:43 -0700650 yield from self._mapping
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000651
Christian Heimesf83be4e2007-11-28 09:44:38 +0000652KeysView.register(dict_keys)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000653
654
655class ItemsView(MappingView, Set):
656
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700657 __slots__ = ()
658
Raymond Hettinger9117c752010-08-22 07:44:24 +0000659 @classmethod
660 def _from_iterable(self, it):
661 return set(it)
662
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000663 def __contains__(self, item):
664 key, value = item
665 try:
666 v = self._mapping[key]
667 except KeyError:
668 return False
669 else:
670 return v == value
671
672 def __iter__(self):
673 for key in self._mapping:
674 yield (key, self._mapping[key])
675
Christian Heimesf83be4e2007-11-28 09:44:38 +0000676ItemsView.register(dict_items)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000677
678
679class ValuesView(MappingView):
680
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700681 __slots__ = ()
682
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000683 def __contains__(self, value):
684 for key in self._mapping:
685 if value == self._mapping[key]:
686 return True
687 return False
688
689 def __iter__(self):
690 for key in self._mapping:
691 yield self._mapping[key]
692
Christian Heimesf83be4e2007-11-28 09:44:38 +0000693ValuesView.register(dict_values)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000694
695
696class MutableMapping(Mapping):
697
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700698 __slots__ = ()
699
Raymond Hettinger153866e2013-03-24 15:20:29 -0700700 """A MutableMapping is a generic container for associating
701 key/value pairs.
702
703 This class provides concrete generic implementations of all
704 methods except for __getitem__, __setitem__, __delitem__,
705 __iter__, and __len__.
706
707 """
708
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000709 @abstractmethod
710 def __setitem__(self, key, value):
711 raise KeyError
712
713 @abstractmethod
714 def __delitem__(self, key):
715 raise KeyError
716
717 __marker = object()
718
719 def pop(self, key, default=__marker):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700720 '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
721 If key is not found, d is returned if given, otherwise KeyError is raised.
722 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000723 try:
724 value = self[key]
725 except KeyError:
726 if default is self.__marker:
727 raise
728 return default
729 else:
730 del self[key]
731 return value
732
733 def popitem(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700734 '''D.popitem() -> (k, v), remove and return some (key, value) pair
735 as a 2-tuple; but raise KeyError if D is empty.
736 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000737 try:
738 key = next(iter(self))
739 except StopIteration:
740 raise KeyError
741 value = self[key]
742 del self[key]
743 return key, value
744
745 def clear(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700746 'D.clear() -> None. Remove all items from D.'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000747 try:
748 while True:
749 self.popitem()
750 except KeyError:
751 pass
752
Mark Dickinsonb214e902010-07-11 18:53:06 +0000753 def update(*args, **kwds):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700754 ''' D.update([E, ]**F) -> None. Update D from mapping/iterable E and F.
755 If E present and has a .keys() method, does: for k in E: D[k] = E[k]
756 If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v
757 In either case, this is followed by: for k, v in F.items(): D[k] = v
758 '''
Serhiy Storchakaae5cb212014-11-27 16:25:51 +0200759 if not args:
760 raise TypeError("descriptor 'update' of 'MutableMapping' object "
761 "needs an argument")
762 self, *args = args
763 if len(args) > 1:
764 raise TypeError('update expected at most 1 arguments, got %d' %
765 len(args))
766 if args:
767 other = args[0]
768 if isinstance(other, Mapping):
769 for key in other:
770 self[key] = other[key]
771 elif hasattr(other, "keys"):
772 for key in other.keys():
773 self[key] = other[key]
774 else:
775 for key, value in other:
776 self[key] = value
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000777 for key, value in kwds.items():
778 self[key] = value
779
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000780 def setdefault(self, key, default=None):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700781 '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 +0000782 try:
783 return self[key]
784 except KeyError:
785 self[key] = default
786 return default
787
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000788MutableMapping.register(dict)
789
790
791### SEQUENCES ###
792
793
Raymond Hettinger74b64952008-02-09 02:53:48 +0000794class Sequence(Sized, Iterable, Container):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000795
796 """All the operations on a read-only sequence.
797
798 Concrete subclasses must override __new__ or __init__,
799 __getitem__, and __len__.
800 """
801
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700802 __slots__ = ()
803
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000804 @abstractmethod
805 def __getitem__(self, index):
806 raise IndexError
807
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000808 def __iter__(self):
809 i = 0
Raymond Hettinger71909422008-02-09 00:08:16 +0000810 try:
811 while True:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000812 v = self[i]
Raymond Hettinger71909422008-02-09 00:08:16 +0000813 yield v
814 i += 1
815 except IndexError:
816 return
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000817
818 def __contains__(self, value):
819 for v in self:
820 if v == value:
821 return True
822 return False
823
824 def __reversed__(self):
825 for i in reversed(range(len(self))):
826 yield self[i]
827
Raymond Hettingerec219ba2015-05-22 19:29:22 -0700828 def index(self, value, start=0, stop=None):
829 '''S.index(value, [start, [stop]]) -> integer -- return first index of value.
Raymond Hettinger153866e2013-03-24 15:20:29 -0700830 Raises ValueError if the value is not present.
831 '''
Raymond Hettingerec219ba2015-05-22 19:29:22 -0700832 if start is not None and start < 0:
833 start = max(len(self) + start, 0)
834 if stop is not None and stop < 0:
835 stop += len(self)
836
837 i = start
838 while stop is None or i < stop:
839 try:
840 if self[i] == value:
841 return i
842 except IndexError:
843 break
844 i += 1
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000845 raise ValueError
846
847 def count(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700848 'S.count(value) -> integer -- return number of occurrences of value'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000849 return sum(1 for v in self if v == value)
850
851Sequence.register(tuple)
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000852Sequence.register(str)
Raymond Hettinger9aa53c22009-02-24 11:25:35 +0000853Sequence.register(range)
Nick Coghlan45163cc2013-10-02 22:31:47 +1000854Sequence.register(memoryview)
Guido van Rossumd05eb002007-11-21 22:26:24 +0000855
856
857class ByteString(Sequence):
858
859 """This unifies bytes and bytearray.
860
861 XXX Should add all their methods.
862 """
863
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700864 __slots__ = ()
865
Guido van Rossumd05eb002007-11-21 22:26:24 +0000866ByteString.register(bytes)
867ByteString.register(bytearray)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000868
869
870class MutableSequence(Sequence):
871
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700872 __slots__ = ()
873
Guido van Rossum840c3102013-07-25 11:55:41 -0700874 """All the operations on a read-write sequence.
Raymond Hettinger153866e2013-03-24 15:20:29 -0700875
876 Concrete subclasses must provide __new__ or __init__,
877 __getitem__, __setitem__, __delitem__, __len__, and insert().
878
879 """
880
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000881 @abstractmethod
882 def __setitem__(self, index, value):
883 raise IndexError
884
885 @abstractmethod
886 def __delitem__(self, index):
887 raise IndexError
888
889 @abstractmethod
890 def insert(self, index, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700891 'S.insert(index, value) -- insert value before index'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000892 raise IndexError
893
894 def append(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700895 'S.append(value) -- append value to the end of the sequence'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000896 self.insert(len(self), value)
897
Eli Bendersky9479d1a2011-03-04 05:34:58 +0000898 def clear(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700899 'S.clear() -> None -- remove all items from S'
Eli Bendersky9479d1a2011-03-04 05:34:58 +0000900 try:
901 while True:
902 self.pop()
903 except IndexError:
904 pass
905
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000906 def reverse(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700907 'S.reverse() -- reverse *IN PLACE*'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000908 n = len(self)
909 for i in range(n//2):
910 self[i], self[n-i-1] = self[n-i-1], self[i]
911
912 def extend(self, values):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700913 'S.extend(iterable) -- extend sequence by appending elements from the iterable'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000914 for v in values:
915 self.append(v)
916
917 def pop(self, index=-1):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700918 '''S.pop([index]) -> item -- remove and return item at index (default last).
919 Raise IndexError if list is empty or index is out of range.
920 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000921 v = self[index]
922 del self[index]
923 return v
924
925 def remove(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700926 '''S.remove(value) -- remove first occurrence of value.
927 Raise ValueError if the value is not present.
928 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000929 del self[self.index(value)]
930
931 def __iadd__(self, values):
932 self.extend(values)
Raymond Hettingerc384b222009-05-18 15:35:26 +0000933 return self
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000934
935MutableSequence.register(list)
Guido van Rossumd05eb002007-11-21 22:26:24 +0000936MutableSequence.register(bytearray) # Multiply inheriting, see ByteString