blob: ea804031d5ee9117bd338cd3b9b707afa696854f [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 Selivanov75445082015-05-11 22:57:16 -040012__all__ = ["Awaitable", "Coroutine",
13 "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
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000151class Iterable(metaclass=ABCMeta):
152
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700153 __slots__ = ()
154
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000155 @abstractmethod
156 def __iter__(self):
157 while False:
158 yield None
159
160 @classmethod
161 def __subclasshook__(cls, C):
162 if cls is Iterable:
163 if any("__iter__" in B.__dict__ for B in C.__mro__):
164 return True
165 return NotImplemented
166
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000167
Raymond Hettinger74b64952008-02-09 02:53:48 +0000168class Iterator(Iterable):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000169
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700170 __slots__ = ()
171
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000172 @abstractmethod
173 def __next__(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700174 'Return the next item from the iterator. When exhausted, raise StopIteration'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000175 raise StopIteration
176
177 def __iter__(self):
178 return self
179
180 @classmethod
181 def __subclasshook__(cls, C):
182 if cls is Iterator:
Raymond Hettingeread22222010-11-29 03:56:12 +0000183 if (any("__next__" in B.__dict__ for B in C.__mro__) and
184 any("__iter__" in B.__dict__ for B in C.__mro__)):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000185 return True
186 return NotImplemented
187
Christian Heimesf83be4e2007-11-28 09:44:38 +0000188Iterator.register(bytes_iterator)
189Iterator.register(bytearray_iterator)
190#Iterator.register(callable_iterator)
191Iterator.register(dict_keyiterator)
192Iterator.register(dict_valueiterator)
193Iterator.register(dict_itemiterator)
194Iterator.register(list_iterator)
195Iterator.register(list_reverseiterator)
196Iterator.register(range_iterator)
197Iterator.register(set_iterator)
198Iterator.register(str_iterator)
199Iterator.register(tuple_iterator)
200Iterator.register(zip_iterator)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000201
Raymond Hettingerbd60e8d2015-05-09 01:07:23 -0400202
203class Generator(Iterator):
204
205 __slots__ = ()
206
207 def __next__(self):
208 """Return the next item from the generator.
209 When exhausted, raise StopIteration.
210 """
211 return self.send(None)
212
213 @abstractmethod
214 def send(self, value):
215 """Send a value into the generator.
216 Return next yielded value or raise StopIteration.
217 """
218 raise StopIteration
219
220 @abstractmethod
221 def throw(self, typ, val=None, tb=None):
222 """Raise an exception in the generator.
223 Return next yielded value or raise StopIteration.
224 """
225 if val is None:
226 if tb is None:
227 raise typ
228 val = typ()
229 if tb is not None:
230 val = val.with_traceback(tb)
231 raise val
232
233 def close(self):
234 """Raise GeneratorExit inside generator.
235 """
236 try:
237 self.throw(GeneratorExit)
238 except (GeneratorExit, StopIteration):
239 pass
240 else:
241 raise RuntimeError("generator ignored GeneratorExit")
242
243 @classmethod
244 def __subclasshook__(cls, C):
245 if cls is Generator:
246 mro = C.__mro__
247 for method in ('__iter__', '__next__', 'send', 'throw', 'close'):
248 for base in mro:
249 if method in base.__dict__:
250 break
251 else:
252 return NotImplemented
253 return True
254 return NotImplemented
255
256
257Generator.register(generator)
258
259
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000260class Sized(metaclass=ABCMeta):
261
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700262 __slots__ = ()
263
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000264 @abstractmethod
265 def __len__(self):
266 return 0
267
268 @classmethod
269 def __subclasshook__(cls, C):
270 if cls is Sized:
271 if any("__len__" in B.__dict__ for B in C.__mro__):
272 return True
273 return NotImplemented
274
275
276class Container(metaclass=ABCMeta):
277
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700278 __slots__ = ()
279
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000280 @abstractmethod
281 def __contains__(self, x):
282 return False
283
284 @classmethod
285 def __subclasshook__(cls, C):
286 if cls is Container:
287 if any("__contains__" in B.__dict__ for B in C.__mro__):
288 return True
289 return NotImplemented
290
291
292class Callable(metaclass=ABCMeta):
293
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700294 __slots__ = ()
295
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000296 @abstractmethod
Christian Heimes78644762008-03-04 23:39:23 +0000297 def __call__(self, *args, **kwds):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000298 return False
299
300 @classmethod
301 def __subclasshook__(cls, C):
302 if cls is Callable:
303 if any("__call__" in B.__dict__ for B in C.__mro__):
304 return True
305 return NotImplemented
306
307
308### SETS ###
309
310
Raymond Hettinger74b64952008-02-09 02:53:48 +0000311class Set(Sized, Iterable, Container):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000312
313 """A set is a finite, iterable container.
314
315 This class provides concrete generic implementations of all
316 methods except for __contains__, __iter__ and __len__.
317
318 To override the comparisons (presumably for speed, as the
Raymond Hettinger11cda472014-07-03 00:31:30 +0100319 semantics are fixed), redefine __le__ and __ge__,
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000320 then the other operations will automatically follow suit.
321 """
322
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700323 __slots__ = ()
324
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000325 def __le__(self, other):
326 if not isinstance(other, Set):
327 return NotImplemented
328 if len(self) > len(other):
329 return False
330 for elem in self:
331 if elem not in other:
332 return False
333 return True
334
335 def __lt__(self, other):
336 if not isinstance(other, Set):
337 return NotImplemented
338 return len(self) < len(other) and self.__le__(other)
339
Raymond Hettinger71909422008-02-09 00:08:16 +0000340 def __gt__(self, other):
341 if not isinstance(other, Set):
342 return NotImplemented
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700343 return len(self) > len(other) and self.__ge__(other)
Raymond Hettinger71909422008-02-09 00:08:16 +0000344
345 def __ge__(self, other):
346 if not isinstance(other, Set):
347 return NotImplemented
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700348 if len(self) < len(other):
349 return False
350 for elem in other:
351 if elem not in self:
352 return False
353 return True
Raymond Hettinger71909422008-02-09 00:08:16 +0000354
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000355 def __eq__(self, other):
356 if not isinstance(other, Set):
357 return NotImplemented
358 return len(self) == len(other) and self.__le__(other)
359
360 @classmethod
361 def _from_iterable(cls, it):
Raymond Hettinger8284c4a2008-02-06 20:47:09 +0000362 '''Construct an instance of the class from any iterable input.
363
364 Must override this method if the class constructor signature
Raymond Hettinger7aebb642008-02-09 03:25:08 +0000365 does not accept an iterable for an input.
Raymond Hettinger8284c4a2008-02-06 20:47:09 +0000366 '''
Raymond Hettinger7aebb642008-02-09 03:25:08 +0000367 return cls(it)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000368
369 def __and__(self, other):
370 if not isinstance(other, Iterable):
371 return NotImplemented
372 return self._from_iterable(value for value in other if value in self)
373
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700374 __rand__ = __and__
375
Christian Heimes190d79e2008-01-30 11:58:22 +0000376 def isdisjoint(self, other):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700377 'Return True if two sets have a null intersection.'
Christian Heimes190d79e2008-01-30 11:58:22 +0000378 for value in other:
379 if value in self:
380 return False
381 return True
382
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000383 def __or__(self, other):
384 if not isinstance(other, Iterable):
385 return NotImplemented
Christian Heimes78644762008-03-04 23:39:23 +0000386 chain = (e for s in (self, other) for e in s)
387 return self._from_iterable(chain)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000388
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700389 __ror__ = __or__
390
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000391 def __sub__(self, other):
392 if not isinstance(other, Set):
393 if not isinstance(other, Iterable):
394 return NotImplemented
395 other = self._from_iterable(other)
396 return self._from_iterable(value for value in self
397 if value not in other)
398
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700399 def __rsub__(self, other):
400 if not isinstance(other, Set):
401 if not isinstance(other, Iterable):
402 return NotImplemented
403 other = self._from_iterable(other)
404 return self._from_iterable(value for value in other
405 if value not in self)
406
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000407 def __xor__(self, other):
408 if not isinstance(other, Set):
409 if not isinstance(other, Iterable):
410 return NotImplemented
411 other = self._from_iterable(other)
412 return (self - other) | (other - self)
413
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700414 __rxor__ = __xor__
415
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000416 def _hash(self):
417 """Compute the hash value of a set.
418
419 Note that we don't define __hash__: not all sets are hashable.
420 But if you define a hashable set type, its __hash__ should
421 call this function.
422
423 This must be compatible __eq__.
424
425 All sets ought to compare equal if they contain the same
426 elements, regardless of how they are implemented, and
427 regardless of the order of the elements; so there's not much
428 freedom for __eq__ or __hash__. We match the algorithm used
429 by the built-in frozenset type.
430 """
Christian Heimesa37d4c62007-12-04 23:02:19 +0000431 MAX = sys.maxsize
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000432 MASK = 2 * MAX + 1
433 n = len(self)
434 h = 1927868237 * (n + 1)
435 h &= MASK
436 for x in self:
437 hx = hash(x)
438 h ^= (hx ^ (hx << 16) ^ 89869747) * 3644798167
439 h &= MASK
440 h = h * 69069 + 907133923
441 h &= MASK
442 if h > MAX:
443 h -= MASK + 1
444 if h == -1:
445 h = 590923713
446 return h
447
448Set.register(frozenset)
449
450
451class MutableSet(Set):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700452 """A mutable set is a finite, iterable container.
453
454 This class provides concrete generic implementations of all
455 methods except for __contains__, __iter__, __len__,
456 add(), and discard().
457
458 To override the comparisons (presumably for speed, as the
459 semantics are fixed), all you have to do is redefine __le__ and
460 then the other operations will automatically follow suit.
461 """
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000462
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700463 __slots__ = ()
464
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000465 @abstractmethod
466 def add(self, value):
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000467 """Add an element."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000468 raise NotImplementedError
469
470 @abstractmethod
471 def discard(self, value):
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000472 """Remove an element. Do not raise an exception if absent."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000473 raise NotImplementedError
474
Christian Heimes190d79e2008-01-30 11:58:22 +0000475 def remove(self, value):
476 """Remove an element. If not a member, raise a KeyError."""
477 if value not in self:
478 raise KeyError(value)
479 self.discard(value)
480
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000481 def pop(self):
482 """Return the popped value. Raise KeyError if empty."""
483 it = iter(self)
484 try:
Raymond Hettingerae650182009-01-28 23:33:59 +0000485 value = next(it)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000486 except StopIteration:
487 raise KeyError
488 self.discard(value)
489 return value
490
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000491 def clear(self):
492 """This is slow (creates N new iterators!) but effective."""
493 try:
494 while True:
495 self.pop()
496 except KeyError:
497 pass
498
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000499 def __ior__(self, it):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000500 for value in it:
501 self.add(value)
502 return self
503
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000504 def __iand__(self, it):
Raymond Hettinger3f10a952009-04-01 19:05:50 +0000505 for value in (self - it):
506 self.discard(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000507 return self
508
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000509 def __ixor__(self, it):
Daniel Stutzbach31da5b22010-08-24 20:49:57 +0000510 if it is self:
511 self.clear()
512 else:
513 if not isinstance(it, Set):
514 it = self._from_iterable(it)
515 for value in it:
516 if value in self:
517 self.discard(value)
518 else:
519 self.add(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000520 return self
521
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000522 def __isub__(self, it):
Daniel Stutzbach31da5b22010-08-24 20:49:57 +0000523 if it is self:
524 self.clear()
525 else:
526 for value in it:
527 self.discard(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000528 return self
529
530MutableSet.register(set)
531
532
533### MAPPINGS ###
534
535
Raymond Hettinger74b64952008-02-09 02:53:48 +0000536class Mapping(Sized, Iterable, Container):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000537
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700538 __slots__ = ()
539
Raymond Hettinger153866e2013-03-24 15:20:29 -0700540 """A Mapping is a generic container for associating key/value
541 pairs.
542
543 This class provides concrete generic implementations of all
544 methods except for __getitem__, __iter__, and __len__.
545
546 """
547
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000548 @abstractmethod
549 def __getitem__(self, key):
550 raise KeyError
551
552 def get(self, key, default=None):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700553 'D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000554 try:
555 return self[key]
556 except KeyError:
557 return default
558
559 def __contains__(self, key):
560 try:
561 self[key]
562 except KeyError:
563 return False
564 else:
565 return True
566
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000567 def keys(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700568 "D.keys() -> a set-like object providing a view on D's keys"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000569 return KeysView(self)
570
571 def items(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700572 "D.items() -> a set-like object providing a view on D's items"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000573 return ItemsView(self)
574
575 def values(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700576 "D.values() -> an object providing a view on D's values"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000577 return ValuesView(self)
578
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000579 def __eq__(self, other):
Benjamin Peterson4ad6bd52010-05-21 20:55:22 +0000580 if not isinstance(other, Mapping):
581 return NotImplemented
582 return dict(self.items()) == dict(other.items())
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000583
Victor Stinner7b17a4e2012-04-20 01:41:36 +0200584Mapping.register(mappingproxy)
585
Christian Heimes2202f872008-02-06 14:31:34 +0000586
Raymond Hettingerbfd06122008-02-09 10:04:32 +0000587class MappingView(Sized):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000588
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700589 __slots__ = '_mapping',
590
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000591 def __init__(self, mapping):
592 self._mapping = mapping
593
594 def __len__(self):
595 return len(self._mapping)
596
Raymond Hettinger89fc2b72009-02-27 07:47:32 +0000597 def __repr__(self):
598 return '{0.__class__.__name__}({0._mapping!r})'.format(self)
599
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000600
601class KeysView(MappingView, Set):
602
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700603 __slots__ = ()
604
Raymond Hettinger9117c752010-08-22 07:44:24 +0000605 @classmethod
606 def _from_iterable(self, it):
607 return set(it)
608
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000609 def __contains__(self, key):
610 return key in self._mapping
611
612 def __iter__(self):
Philip Jenvey4993cc02012-10-01 12:53:43 -0700613 yield from self._mapping
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000614
Christian Heimesf83be4e2007-11-28 09:44:38 +0000615KeysView.register(dict_keys)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000616
617
618class ItemsView(MappingView, Set):
619
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700620 __slots__ = ()
621
Raymond Hettinger9117c752010-08-22 07:44:24 +0000622 @classmethod
623 def _from_iterable(self, it):
624 return set(it)
625
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000626 def __contains__(self, item):
627 key, value = item
628 try:
629 v = self._mapping[key]
630 except KeyError:
631 return False
632 else:
633 return v == value
634
635 def __iter__(self):
636 for key in self._mapping:
637 yield (key, self._mapping[key])
638
Christian Heimesf83be4e2007-11-28 09:44:38 +0000639ItemsView.register(dict_items)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000640
641
642class ValuesView(MappingView):
643
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700644 __slots__ = ()
645
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000646 def __contains__(self, value):
647 for key in self._mapping:
648 if value == self._mapping[key]:
649 return True
650 return False
651
652 def __iter__(self):
653 for key in self._mapping:
654 yield self._mapping[key]
655
Christian Heimesf83be4e2007-11-28 09:44:38 +0000656ValuesView.register(dict_values)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000657
658
659class MutableMapping(Mapping):
660
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700661 __slots__ = ()
662
Raymond Hettinger153866e2013-03-24 15:20:29 -0700663 """A MutableMapping is a generic container for associating
664 key/value pairs.
665
666 This class provides concrete generic implementations of all
667 methods except for __getitem__, __setitem__, __delitem__,
668 __iter__, and __len__.
669
670 """
671
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000672 @abstractmethod
673 def __setitem__(self, key, value):
674 raise KeyError
675
676 @abstractmethod
677 def __delitem__(self, key):
678 raise KeyError
679
680 __marker = object()
681
682 def pop(self, key, default=__marker):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700683 '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
684 If key is not found, d is returned if given, otherwise KeyError is raised.
685 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000686 try:
687 value = self[key]
688 except KeyError:
689 if default is self.__marker:
690 raise
691 return default
692 else:
693 del self[key]
694 return value
695
696 def popitem(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700697 '''D.popitem() -> (k, v), remove and return some (key, value) pair
698 as a 2-tuple; but raise KeyError if D is empty.
699 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000700 try:
701 key = next(iter(self))
702 except StopIteration:
703 raise KeyError
704 value = self[key]
705 del self[key]
706 return key, value
707
708 def clear(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700709 'D.clear() -> None. Remove all items from D.'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000710 try:
711 while True:
712 self.popitem()
713 except KeyError:
714 pass
715
Mark Dickinsonb214e902010-07-11 18:53:06 +0000716 def update(*args, **kwds):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700717 ''' D.update([E, ]**F) -> None. Update D from mapping/iterable E and F.
718 If E present and has a .keys() method, does: for k in E: D[k] = E[k]
719 If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v
720 In either case, this is followed by: for k, v in F.items(): D[k] = v
721 '''
Serhiy Storchakaae5cb212014-11-27 16:25:51 +0200722 if not args:
723 raise TypeError("descriptor 'update' of 'MutableMapping' object "
724 "needs an argument")
725 self, *args = args
726 if len(args) > 1:
727 raise TypeError('update expected at most 1 arguments, got %d' %
728 len(args))
729 if args:
730 other = args[0]
731 if isinstance(other, Mapping):
732 for key in other:
733 self[key] = other[key]
734 elif hasattr(other, "keys"):
735 for key in other.keys():
736 self[key] = other[key]
737 else:
738 for key, value in other:
739 self[key] = value
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000740 for key, value in kwds.items():
741 self[key] = value
742
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000743 def setdefault(self, key, default=None):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700744 '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 +0000745 try:
746 return self[key]
747 except KeyError:
748 self[key] = default
749 return default
750
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000751MutableMapping.register(dict)
752
753
754### SEQUENCES ###
755
756
Raymond Hettinger74b64952008-02-09 02:53:48 +0000757class Sequence(Sized, Iterable, Container):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000758
759 """All the operations on a read-only sequence.
760
761 Concrete subclasses must override __new__ or __init__,
762 __getitem__, and __len__.
763 """
764
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700765 __slots__ = ()
766
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000767 @abstractmethod
768 def __getitem__(self, index):
769 raise IndexError
770
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000771 def __iter__(self):
772 i = 0
Raymond Hettinger71909422008-02-09 00:08:16 +0000773 try:
774 while True:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000775 v = self[i]
Raymond Hettinger71909422008-02-09 00:08:16 +0000776 yield v
777 i += 1
778 except IndexError:
779 return
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000780
781 def __contains__(self, value):
782 for v in self:
783 if v == value:
784 return True
785 return False
786
787 def __reversed__(self):
788 for i in reversed(range(len(self))):
789 yield self[i]
790
791 def index(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700792 '''S.index(value) -> integer -- return first index of value.
793 Raises ValueError if the value is not present.
794 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000795 for i, v in enumerate(self):
796 if v == value:
797 return i
798 raise ValueError
799
800 def count(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700801 'S.count(value) -> integer -- return number of occurrences of value'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000802 return sum(1 for v in self if v == value)
803
804Sequence.register(tuple)
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000805Sequence.register(str)
Raymond Hettinger9aa53c22009-02-24 11:25:35 +0000806Sequence.register(range)
Nick Coghlan45163cc2013-10-02 22:31:47 +1000807Sequence.register(memoryview)
Guido van Rossumd05eb002007-11-21 22:26:24 +0000808
809
810class ByteString(Sequence):
811
812 """This unifies bytes and bytearray.
813
814 XXX Should add all their methods.
815 """
816
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700817 __slots__ = ()
818
Guido van Rossumd05eb002007-11-21 22:26:24 +0000819ByteString.register(bytes)
820ByteString.register(bytearray)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000821
822
823class MutableSequence(Sequence):
824
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700825 __slots__ = ()
826
Guido van Rossum840c3102013-07-25 11:55:41 -0700827 """All the operations on a read-write sequence.
Raymond Hettinger153866e2013-03-24 15:20:29 -0700828
829 Concrete subclasses must provide __new__ or __init__,
830 __getitem__, __setitem__, __delitem__, __len__, and insert().
831
832 """
833
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000834 @abstractmethod
835 def __setitem__(self, index, value):
836 raise IndexError
837
838 @abstractmethod
839 def __delitem__(self, index):
840 raise IndexError
841
842 @abstractmethod
843 def insert(self, index, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700844 'S.insert(index, value) -- insert value before index'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000845 raise IndexError
846
847 def append(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700848 'S.append(value) -- append value to the end of the sequence'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000849 self.insert(len(self), value)
850
Eli Bendersky9479d1a2011-03-04 05:34:58 +0000851 def clear(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700852 'S.clear() -> None -- remove all items from S'
Eli Bendersky9479d1a2011-03-04 05:34:58 +0000853 try:
854 while True:
855 self.pop()
856 except IndexError:
857 pass
858
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000859 def reverse(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700860 'S.reverse() -- reverse *IN PLACE*'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000861 n = len(self)
862 for i in range(n//2):
863 self[i], self[n-i-1] = self[n-i-1], self[i]
864
865 def extend(self, values):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700866 'S.extend(iterable) -- extend sequence by appending elements from the iterable'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000867 for v in values:
868 self.append(v)
869
870 def pop(self, index=-1):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700871 '''S.pop([index]) -> item -- remove and return item at index (default last).
872 Raise IndexError if list is empty or index is out of range.
873 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000874 v = self[index]
875 del self[index]
876 return v
877
878 def remove(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700879 '''S.remove(value) -- remove first occurrence of value.
880 Raise ValueError if the value is not present.
881 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000882 del self[self.index(value)]
883
884 def __iadd__(self, values):
885 self.extend(values)
Raymond Hettingerc384b222009-05-18 15:35:26 +0000886 return self
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000887
888MutableSequence.register(list)
Guido van Rossumd05eb002007-11-21 22:26:24 +0000889MutableSequence.register(bytearray) # Multiply inheriting, see ByteString