blob: ee7d0f18f81c8f5ed3b529ff6a17dc7359cfd74f [file] [log] [blame]
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001# Copyright 2007 Google, Inc. All Rights Reserved.
2# Licensed to PSF under a Contributor Agreement.
3
4"""Abstract Base Classes (ABCs) for collections, according to PEP 3119.
5
Raymond Hettinger158c9c22011-02-22 00:41:50 +00006Unit tests are in test_collections.
Guido van Rossumcd16bf62007-06-13 18:07:49 +00007"""
8
9from abc import ABCMeta, abstractmethod
Benjamin Peterson41181742008-07-02 20:22:54 +000010import sys
Guido van Rossumcd16bf62007-06-13 18:07:49 +000011
Yury Selivanove0104ae2015-05-14 12:19:16 -040012__all__ = ["Awaitable", "Coroutine", "AsyncIterable", "AsyncIterator",
Guido van Rossum16ca06b2016-04-04 10:59:29 -070013 "Hashable", "Iterable", "Iterator", "Generator", "Reversible",
Guido van Rossumf0666942016-08-23 10:47:07 -070014 "Sized", "Container", "Callable", "Collection",
Guido van Rossumcd16bf62007-06-13 18:07:49 +000015 "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)
Serhiy Storchaka3bd9fde2016-10-08 21:33:59 +030032# Note: in other implementations, these types might not be distinct
33# and they may have their own implementation specific types that
Raymond Hettinger02184282012-04-05 13:31:12 -070034# 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)))
Serhiy Storchaka48b1c3f2016-10-08 22:04:12 +030044longrange_iterator = type(iter(range(1 << 1000)))
Christian Heimesf83be4e2007-11-28 09:44:38 +000045set_iterator = type(iter(set()))
46str_iterator = type(iter(""))
47tuple_iterator = type(iter(()))
48zip_iterator = type(iter(zip()))
49## views ##
50dict_keys = type({}.keys())
51dict_values = type({}.values())
52dict_items = type({}.items())
Christian Heimes0db38532007-11-29 16:21:13 +000053## misc ##
Victor Stinner7b17a4e2012-04-20 01:41:36 +020054mappingproxy = type(type.__dict__)
Raymond Hettingerbd60e8d2015-05-09 01:07:23 -040055generator = type((lambda: (yield))())
Yury Selivanov5376ba92015-06-22 12:19:30 -040056## coroutine ##
57async def _coro(): pass
58_coro = _coro()
59coroutine = type(_coro)
60_coro.close() # Prevent ResourceWarning
61del _coro
Christian Heimesf83be4e2007-11-28 09:44:38 +000062
63
Guido van Rossumcd16bf62007-06-13 18:07:49 +000064### ONE-TRICK PONIES ###
65
Guido van Rossum97c1adf2016-08-18 09:22:23 -070066def _check_methods(C, *methods):
67 mro = C.__mro__
68 for method in methods:
69 for B in mro:
70 if method in B.__dict__:
71 if B.__dict__[method] is None:
72 return NotImplemented
73 break
74 else:
75 return NotImplemented
76 return True
77
Guido van Rossumcd16bf62007-06-13 18:07:49 +000078class Hashable(metaclass=ABCMeta):
79
Raymond Hettingerc46759a2011-03-22 11:46:25 -070080 __slots__ = ()
81
Guido van Rossumcd16bf62007-06-13 18:07:49 +000082 @abstractmethod
83 def __hash__(self):
84 return 0
85
86 @classmethod
87 def __subclasshook__(cls, C):
88 if cls is Hashable:
Guido van Rossum97c1adf2016-08-18 09:22:23 -070089 return _check_methods(C, "__hash__")
Guido van Rossumcd16bf62007-06-13 18:07:49 +000090 return NotImplemented
91
92
Yury Selivanovfdbeb2b2015-07-03 13:11:35 -040093class Awaitable(metaclass=ABCMeta):
Yury Selivanov56fc6142015-05-29 09:01:29 -040094
95 __slots__ = ()
96
97 @abstractmethod
98 def __await__(self):
99 yield
100
101 @classmethod
102 def __subclasshook__(cls, C):
103 if cls is Awaitable:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700104 return _check_methods(C, "__await__")
Yury Selivanov56fc6142015-05-29 09:01:29 -0400105 return NotImplemented
106
107
108class Coroutine(Awaitable):
Yury Selivanov75445082015-05-11 22:57:16 -0400109
110 __slots__ = ()
111
112 @abstractmethod
113 def send(self, value):
114 """Send a value into the coroutine.
115 Return next yielded value or raise StopIteration.
116 """
117 raise StopIteration
118
119 @abstractmethod
120 def throw(self, typ, val=None, tb=None):
121 """Raise an exception in the coroutine.
122 Return next yielded value or raise StopIteration.
123 """
124 if val is None:
125 if tb is None:
126 raise typ
127 val = typ()
128 if tb is not None:
129 val = val.with_traceback(tb)
130 raise val
131
132 def close(self):
133 """Raise GeneratorExit inside coroutine.
134 """
135 try:
136 self.throw(GeneratorExit)
137 except (GeneratorExit, StopIteration):
138 pass
139 else:
140 raise RuntimeError("coroutine ignored GeneratorExit")
141
Yury Selivanov75445082015-05-11 22:57:16 -0400142 @classmethod
143 def __subclasshook__(cls, C):
Yury Selivanov56fc6142015-05-29 09:01:29 -0400144 if cls is Coroutine:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700145 return _check_methods(C, '__await__', 'send', 'throw', 'close')
Yury Selivanov75445082015-05-11 22:57:16 -0400146 return NotImplemented
147
Yury Selivanov75445082015-05-11 22:57:16 -0400148
Yury Selivanov5376ba92015-06-22 12:19:30 -0400149Coroutine.register(coroutine)
150
151
Yury Selivanove0104ae2015-05-14 12:19:16 -0400152class AsyncIterable(metaclass=ABCMeta):
153
154 __slots__ = ()
155
156 @abstractmethod
Yury Selivanova6f6edb2016-06-09 15:08:31 -0400157 def __aiter__(self):
Yury Selivanove0104ae2015-05-14 12:19:16 -0400158 return AsyncIterator()
159
160 @classmethod
161 def __subclasshook__(cls, C):
162 if cls is AsyncIterable:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700163 return _check_methods(C, "__aiter__")
Yury Selivanove0104ae2015-05-14 12:19:16 -0400164 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
Yury Selivanova6f6edb2016-06-09 15:08:31 -0400176 def __aiter__(self):
Yury Selivanove0104ae2015-05-14 12:19:16 -0400177 return self
178
179 @classmethod
180 def __subclasshook__(cls, C):
181 if cls is AsyncIterator:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700182 return _check_methods(C, "__anext__", "__aiter__")
Yury Selivanove0104ae2015-05-14 12:19:16 -0400183 return NotImplemented
184
185
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000186class Iterable(metaclass=ABCMeta):
187
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700188 __slots__ = ()
189
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000190 @abstractmethod
191 def __iter__(self):
192 while False:
193 yield None
194
195 @classmethod
196 def __subclasshook__(cls, C):
197 if cls is Iterable:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700198 return _check_methods(C, "__iter__")
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000199 return NotImplemented
200
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000201
Raymond Hettinger74b64952008-02-09 02:53:48 +0000202class Iterator(Iterable):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000203
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700204 __slots__ = ()
205
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000206 @abstractmethod
207 def __next__(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700208 'Return the next item from the iterator. When exhausted, raise StopIteration'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000209 raise StopIteration
210
211 def __iter__(self):
212 return self
213
214 @classmethod
215 def __subclasshook__(cls, C):
216 if cls is Iterator:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700217 return _check_methods(C, '__iter__', '__next__')
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000218 return NotImplemented
219
Christian Heimesf83be4e2007-11-28 09:44:38 +0000220Iterator.register(bytes_iterator)
221Iterator.register(bytearray_iterator)
222#Iterator.register(callable_iterator)
223Iterator.register(dict_keyiterator)
224Iterator.register(dict_valueiterator)
225Iterator.register(dict_itemiterator)
226Iterator.register(list_iterator)
227Iterator.register(list_reverseiterator)
228Iterator.register(range_iterator)
Serhiy Storchaka48b1c3f2016-10-08 22:04:12 +0300229Iterator.register(longrange_iterator)
Christian Heimesf83be4e2007-11-28 09:44:38 +0000230Iterator.register(set_iterator)
231Iterator.register(str_iterator)
232Iterator.register(tuple_iterator)
233Iterator.register(zip_iterator)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000234
Raymond Hettingerbd60e8d2015-05-09 01:07:23 -0400235
Guido van Rossum16ca06b2016-04-04 10:59:29 -0700236class Reversible(Iterable):
237
238 __slots__ = ()
239
240 @abstractmethod
241 def __reversed__(self):
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700242 while False:
243 yield None
Guido van Rossum16ca06b2016-04-04 10:59:29 -0700244
245 @classmethod
246 def __subclasshook__(cls, C):
247 if cls is Reversible:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700248 return _check_methods(C, "__reversed__", "__iter__")
Guido van Rossum16ca06b2016-04-04 10:59:29 -0700249 return NotImplemented
250
251
Raymond Hettingerbd60e8d2015-05-09 01:07:23 -0400252class Generator(Iterator):
253
254 __slots__ = ()
255
256 def __next__(self):
257 """Return the next item from the generator.
258 When exhausted, raise StopIteration.
259 """
260 return self.send(None)
261
262 @abstractmethod
263 def send(self, value):
264 """Send a value into the generator.
265 Return next yielded value or raise StopIteration.
266 """
267 raise StopIteration
268
269 @abstractmethod
270 def throw(self, typ, val=None, tb=None):
271 """Raise an exception in the generator.
272 Return next yielded value or raise StopIteration.
273 """
274 if val is None:
275 if tb is None:
276 raise typ
277 val = typ()
278 if tb is not None:
279 val = val.with_traceback(tb)
280 raise val
281
282 def close(self):
283 """Raise GeneratorExit inside generator.
284 """
285 try:
286 self.throw(GeneratorExit)
287 except (GeneratorExit, StopIteration):
288 pass
289 else:
290 raise RuntimeError("generator ignored GeneratorExit")
291
292 @classmethod
293 def __subclasshook__(cls, C):
294 if cls is Generator:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700295 return _check_methods(C, '__iter__', '__next__',
296 'send', 'throw', 'close')
Raymond Hettingerbd60e8d2015-05-09 01:07:23 -0400297 return NotImplemented
298
Raymond Hettingerbd60e8d2015-05-09 01:07:23 -0400299Generator.register(generator)
300
301
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000302class Sized(metaclass=ABCMeta):
303
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700304 __slots__ = ()
305
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000306 @abstractmethod
307 def __len__(self):
308 return 0
309
310 @classmethod
311 def __subclasshook__(cls, C):
312 if cls is Sized:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700313 return _check_methods(C, "__len__")
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000314 return NotImplemented
315
316
317class Container(metaclass=ABCMeta):
318
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700319 __slots__ = ()
320
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000321 @abstractmethod
322 def __contains__(self, x):
323 return False
324
325 @classmethod
326 def __subclasshook__(cls, C):
327 if cls is Container:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700328 return _check_methods(C, "__contains__")
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000329 return NotImplemented
330
Guido van Rossumf0666942016-08-23 10:47:07 -0700331class Collection(Sized, Iterable, Container):
332
333 __slots__ = ()
334
335 @classmethod
336 def __subclasshook__(cls, C):
337 if cls is Collection:
338 return _check_methods(C, "__len__", "__iter__", "__contains__")
339 return NotImplemented
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000340
341class Callable(metaclass=ABCMeta):
342
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700343 __slots__ = ()
344
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000345 @abstractmethod
Christian Heimes78644762008-03-04 23:39:23 +0000346 def __call__(self, *args, **kwds):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000347 return False
348
349 @classmethod
350 def __subclasshook__(cls, C):
351 if cls is Callable:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700352 return _check_methods(C, "__call__")
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000353 return NotImplemented
354
355
356### SETS ###
357
358
Guido van Rossumf0666942016-08-23 10:47:07 -0700359class Set(Collection):
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
Guido van Rossumf0666942016-08-23 10:47:07 -0700584class Mapping(Collection):
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
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700632 __reversed__ = None
633
Victor Stinner7b17a4e2012-04-20 01:41:36 +0200634Mapping.register(mappingproxy)
635
Christian Heimes2202f872008-02-06 14:31:34 +0000636
Raymond Hettingerbfd06122008-02-09 10:04:32 +0000637class MappingView(Sized):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000638
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700639 __slots__ = '_mapping',
640
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000641 def __init__(self, mapping):
642 self._mapping = mapping
643
644 def __len__(self):
645 return len(self._mapping)
646
Raymond Hettinger89fc2b72009-02-27 07:47:32 +0000647 def __repr__(self):
648 return '{0.__class__.__name__}({0._mapping!r})'.format(self)
649
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000650
651class KeysView(MappingView, Set):
652
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700653 __slots__ = ()
654
Raymond Hettinger9117c752010-08-22 07:44:24 +0000655 @classmethod
656 def _from_iterable(self, it):
657 return set(it)
658
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000659 def __contains__(self, key):
660 return key in self._mapping
661
662 def __iter__(self):
Philip Jenvey4993cc02012-10-01 12:53:43 -0700663 yield from self._mapping
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000664
Christian Heimesf83be4e2007-11-28 09:44:38 +0000665KeysView.register(dict_keys)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000666
667
668class ItemsView(MappingView, Set):
669
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700670 __slots__ = ()
671
Raymond Hettinger9117c752010-08-22 07:44:24 +0000672 @classmethod
673 def _from_iterable(self, it):
674 return set(it)
675
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000676 def __contains__(self, item):
677 key, value = item
678 try:
679 v = self._mapping[key]
680 except KeyError:
681 return False
682 else:
Raymond Hettinger584e8ae2016-05-05 11:14:06 +0300683 return v is value or v == value
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000684
685 def __iter__(self):
686 for key in self._mapping:
687 yield (key, self._mapping[key])
688
Christian Heimesf83be4e2007-11-28 09:44:38 +0000689ItemsView.register(dict_items)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000690
691
692class ValuesView(MappingView):
693
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700694 __slots__ = ()
695
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000696 def __contains__(self, value):
697 for key in self._mapping:
Raymond Hettinger584e8ae2016-05-05 11:14:06 +0300698 v = self._mapping[key]
699 if v is value or v == value:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000700 return True
701 return False
702
703 def __iter__(self):
704 for key in self._mapping:
705 yield self._mapping[key]
706
Christian Heimesf83be4e2007-11-28 09:44:38 +0000707ValuesView.register(dict_values)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000708
709
710class MutableMapping(Mapping):
711
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700712 __slots__ = ()
713
Raymond Hettinger153866e2013-03-24 15:20:29 -0700714 """A MutableMapping is a generic container for associating
715 key/value pairs.
716
717 This class provides concrete generic implementations of all
718 methods except for __getitem__, __setitem__, __delitem__,
719 __iter__, and __len__.
720
721 """
722
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000723 @abstractmethod
724 def __setitem__(self, key, value):
725 raise KeyError
726
727 @abstractmethod
728 def __delitem__(self, key):
729 raise KeyError
730
731 __marker = object()
732
733 def pop(self, key, default=__marker):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700734 '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
735 If key is not found, d is returned if given, otherwise KeyError is raised.
736 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000737 try:
738 value = self[key]
739 except KeyError:
740 if default is self.__marker:
741 raise
742 return default
743 else:
744 del self[key]
745 return value
746
747 def popitem(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700748 '''D.popitem() -> (k, v), remove and return some (key, value) pair
749 as a 2-tuple; but raise KeyError if D is empty.
750 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000751 try:
752 key = next(iter(self))
753 except StopIteration:
754 raise KeyError
755 value = self[key]
756 del self[key]
757 return key, value
758
759 def clear(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700760 'D.clear() -> None. Remove all items from D.'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000761 try:
762 while True:
763 self.popitem()
764 except KeyError:
765 pass
766
Mark Dickinsonb214e902010-07-11 18:53:06 +0000767 def update(*args, **kwds):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700768 ''' D.update([E, ]**F) -> None. Update D from mapping/iterable E and F.
769 If E present and has a .keys() method, does: for k in E: D[k] = E[k]
770 If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v
771 In either case, this is followed by: for k, v in F.items(): D[k] = v
772 '''
Serhiy Storchakaae5cb212014-11-27 16:25:51 +0200773 if not args:
774 raise TypeError("descriptor 'update' of 'MutableMapping' object "
775 "needs an argument")
776 self, *args = args
777 if len(args) > 1:
778 raise TypeError('update expected at most 1 arguments, got %d' %
779 len(args))
780 if args:
781 other = args[0]
782 if isinstance(other, Mapping):
783 for key in other:
784 self[key] = other[key]
785 elif hasattr(other, "keys"):
786 for key in other.keys():
787 self[key] = other[key]
788 else:
789 for key, value in other:
790 self[key] = value
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000791 for key, value in kwds.items():
792 self[key] = value
793
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000794 def setdefault(self, key, default=None):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700795 '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 +0000796 try:
797 return self[key]
798 except KeyError:
799 self[key] = default
800 return default
801
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000802MutableMapping.register(dict)
803
804
805### SEQUENCES ###
806
807
Guido van Rossumf0666942016-08-23 10:47:07 -0700808class Sequence(Reversible, Collection):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000809
810 """All the operations on a read-only sequence.
811
812 Concrete subclasses must override __new__ or __init__,
813 __getitem__, and __len__.
814 """
815
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700816 __slots__ = ()
817
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000818 @abstractmethod
819 def __getitem__(self, index):
820 raise IndexError
821
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000822 def __iter__(self):
823 i = 0
Raymond Hettinger71909422008-02-09 00:08:16 +0000824 try:
825 while True:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000826 v = self[i]
Raymond Hettinger71909422008-02-09 00:08:16 +0000827 yield v
828 i += 1
829 except IndexError:
830 return
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000831
832 def __contains__(self, value):
833 for v in self:
Raymond Hettinger584e8ae2016-05-05 11:14:06 +0300834 if v is value or v == value:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000835 return True
836 return False
837
838 def __reversed__(self):
839 for i in reversed(range(len(self))):
840 yield self[i]
841
Raymond Hettingerec219ba2015-05-22 19:29:22 -0700842 def index(self, value, start=0, stop=None):
843 '''S.index(value, [start, [stop]]) -> integer -- return first index of value.
Raymond Hettinger153866e2013-03-24 15:20:29 -0700844 Raises ValueError if the value is not present.
845 '''
Raymond Hettingerec219ba2015-05-22 19:29:22 -0700846 if start is not None and start < 0:
847 start = max(len(self) + start, 0)
848 if stop is not None and stop < 0:
849 stop += len(self)
850
851 i = start
852 while stop is None or i < stop:
853 try:
854 if self[i] == value:
855 return i
856 except IndexError:
857 break
858 i += 1
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000859 raise ValueError
860
861 def count(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700862 'S.count(value) -> integer -- return number of occurrences of value'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000863 return sum(1 for v in self if v == value)
864
865Sequence.register(tuple)
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000866Sequence.register(str)
Raymond Hettinger9aa53c22009-02-24 11:25:35 +0000867Sequence.register(range)
Nick Coghlan45163cc2013-10-02 22:31:47 +1000868Sequence.register(memoryview)
Guido van Rossumd05eb002007-11-21 22:26:24 +0000869
870
871class ByteString(Sequence):
872
873 """This unifies bytes and bytearray.
874
875 XXX Should add all their methods.
876 """
877
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700878 __slots__ = ()
879
Guido van Rossumd05eb002007-11-21 22:26:24 +0000880ByteString.register(bytes)
881ByteString.register(bytearray)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000882
883
884class MutableSequence(Sequence):
885
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700886 __slots__ = ()
887
Guido van Rossum840c3102013-07-25 11:55:41 -0700888 """All the operations on a read-write sequence.
Raymond Hettinger153866e2013-03-24 15:20:29 -0700889
890 Concrete subclasses must provide __new__ or __init__,
891 __getitem__, __setitem__, __delitem__, __len__, and insert().
892
893 """
894
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000895 @abstractmethod
896 def __setitem__(self, index, value):
897 raise IndexError
898
899 @abstractmethod
900 def __delitem__(self, index):
901 raise IndexError
902
903 @abstractmethod
904 def insert(self, index, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700905 'S.insert(index, value) -- insert value before index'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000906 raise IndexError
907
908 def append(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700909 'S.append(value) -- append value to the end of the sequence'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000910 self.insert(len(self), value)
911
Eli Bendersky9479d1a2011-03-04 05:34:58 +0000912 def clear(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700913 'S.clear() -> None -- remove all items from S'
Eli Bendersky9479d1a2011-03-04 05:34:58 +0000914 try:
915 while True:
916 self.pop()
917 except IndexError:
918 pass
919
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000920 def reverse(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700921 'S.reverse() -- reverse *IN PLACE*'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000922 n = len(self)
923 for i in range(n//2):
924 self[i], self[n-i-1] = self[n-i-1], self[i]
925
926 def extend(self, values):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700927 'S.extend(iterable) -- extend sequence by appending elements from the iterable'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000928 for v in values:
929 self.append(v)
930
931 def pop(self, index=-1):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700932 '''S.pop([index]) -> item -- remove and return item at index (default last).
933 Raise IndexError if list is empty or index is out of range.
934 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000935 v = self[index]
936 del self[index]
937 return v
938
939 def remove(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700940 '''S.remove(value) -- remove first occurrence of value.
941 Raise ValueError if the value is not present.
942 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000943 del self[self.index(value)]
944
945 def __iadd__(self, values):
946 self.extend(values)
Raymond Hettingerc384b222009-05-18 15:35:26 +0000947 return self
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000948
949MutableSequence.register(list)
Guido van Rossumd05eb002007-11-21 22:26:24 +0000950MutableSequence.register(bytearray) # Multiply inheriting, see ByteString