blob: 36cd993000347520be16ee3a2a1eb600cff56a8d [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
Guido van Rossum48b069a2020-04-07 09:50:06 -070012GenericAlias = type(list[int])
13
Yury Selivanov22214ab2016-11-16 18:25:04 -050014__all__ = ["Awaitable", "Coroutine",
15 "AsyncIterable", "AsyncIterator", "AsyncGenerator",
Guido van Rossum16ca06b2016-04-04 10:59:29 -070016 "Hashable", "Iterable", "Iterator", "Generator", "Reversible",
Guido van Rossumf0666942016-08-23 10:47:07 -070017 "Sized", "Container", "Callable", "Collection",
Guido van Rossumcd16bf62007-06-13 18:07:49 +000018 "Set", "MutableSet",
19 "Mapping", "MutableMapping",
20 "MappingView", "KeysView", "ItemsView", "ValuesView",
21 "Sequence", "MutableSequence",
Guido van Rossumd05eb002007-11-21 22:26:24 +000022 "ByteString",
Guido van Rossumcd16bf62007-06-13 18:07:49 +000023 ]
24
Christian Heimesbf235bd2013-10-13 02:21:33 +020025# This module has been renamed from collections.abc to _collections_abc to
26# speed up interpreter startup. Some of the types such as MutableMapping are
27# required early but collections module imports a lot of other modules.
28# See issue #19218
29__name__ = "collections.abc"
30
Raymond Hettinger02184282012-04-05 13:31:12 -070031# Private list of types that we want to register with the various ABCs
32# so that they will pass tests like:
33# it = iter(somebytearray)
34# assert isinstance(it, Iterable)
Serhiy Storchaka3bd9fde2016-10-08 21:33:59 +030035# Note: in other implementations, these types might not be distinct
36# and they may have their own implementation specific types that
Raymond Hettinger02184282012-04-05 13:31:12 -070037# are not included on this list.
Christian Heimesf83be4e2007-11-28 09:44:38 +000038bytes_iterator = type(iter(b''))
39bytearray_iterator = type(iter(bytearray()))
40#callable_iterator = ???
41dict_keyiterator = type(iter({}.keys()))
42dict_valueiterator = type(iter({}.values()))
43dict_itemiterator = type(iter({}.items()))
44list_iterator = type(iter([]))
45list_reverseiterator = type(iter(reversed([])))
46range_iterator = type(iter(range(0)))
Serhiy Storchaka48b1c3f2016-10-08 22:04:12 +030047longrange_iterator = type(iter(range(1 << 1000)))
Christian Heimesf83be4e2007-11-28 09:44:38 +000048set_iterator = type(iter(set()))
49str_iterator = type(iter(""))
50tuple_iterator = type(iter(()))
51zip_iterator = type(iter(zip()))
52## views ##
53dict_keys = type({}.keys())
54dict_values = type({}.values())
55dict_items = type({}.items())
Christian Heimes0db38532007-11-29 16:21:13 +000056## misc ##
Victor Stinner7b17a4e2012-04-20 01:41:36 +020057mappingproxy = type(type.__dict__)
Raymond Hettingerbd60e8d2015-05-09 01:07:23 -040058generator = type((lambda: (yield))())
Yury Selivanov5376ba92015-06-22 12:19:30 -040059## coroutine ##
60async def _coro(): pass
61_coro = _coro()
62coroutine = type(_coro)
63_coro.close() # Prevent ResourceWarning
64del _coro
Yury Selivanov22214ab2016-11-16 18:25:04 -050065## asynchronous generator ##
66async def _ag(): yield
67_ag = _ag()
68async_generator = type(_ag)
69del _ag
Christian Heimesf83be4e2007-11-28 09:44:38 +000070
71
Guido van Rossumcd16bf62007-06-13 18:07:49 +000072### ONE-TRICK PONIES ###
73
Guido van Rossum97c1adf2016-08-18 09:22:23 -070074def _check_methods(C, *methods):
75 mro = C.__mro__
76 for method in methods:
77 for B in mro:
78 if method in B.__dict__:
79 if B.__dict__[method] is None:
80 return NotImplemented
81 break
82 else:
83 return NotImplemented
84 return True
85
Guido van Rossumcd16bf62007-06-13 18:07:49 +000086class Hashable(metaclass=ABCMeta):
87
Raymond Hettingerc46759a2011-03-22 11:46:25 -070088 __slots__ = ()
89
Guido van Rossumcd16bf62007-06-13 18:07:49 +000090 @abstractmethod
91 def __hash__(self):
92 return 0
93
94 @classmethod
95 def __subclasshook__(cls, C):
96 if cls is Hashable:
Guido van Rossum97c1adf2016-08-18 09:22:23 -070097 return _check_methods(C, "__hash__")
Guido van Rossumcd16bf62007-06-13 18:07:49 +000098 return NotImplemented
99
100
Yury Selivanovfdbeb2b2015-07-03 13:11:35 -0400101class Awaitable(metaclass=ABCMeta):
Yury Selivanov56fc6142015-05-29 09:01:29 -0400102
103 __slots__ = ()
104
105 @abstractmethod
106 def __await__(self):
107 yield
108
109 @classmethod
110 def __subclasshook__(cls, C):
111 if cls is Awaitable:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700112 return _check_methods(C, "__await__")
Yury Selivanov56fc6142015-05-29 09:01:29 -0400113 return NotImplemented
114
Guido van Rossum48b069a2020-04-07 09:50:06 -0700115 __class_getitem__ = classmethod(GenericAlias)
116
Yury Selivanov56fc6142015-05-29 09:01:29 -0400117
118class Coroutine(Awaitable):
Yury Selivanov75445082015-05-11 22:57:16 -0400119
120 __slots__ = ()
121
122 @abstractmethod
123 def send(self, value):
124 """Send a value into the coroutine.
125 Return next yielded value or raise StopIteration.
126 """
127 raise StopIteration
128
129 @abstractmethod
130 def throw(self, typ, val=None, tb=None):
131 """Raise an exception in the coroutine.
132 Return next yielded value or raise StopIteration.
133 """
134 if val is None:
135 if tb is None:
136 raise typ
137 val = typ()
138 if tb is not None:
139 val = val.with_traceback(tb)
140 raise val
141
142 def close(self):
143 """Raise GeneratorExit inside coroutine.
144 """
145 try:
146 self.throw(GeneratorExit)
147 except (GeneratorExit, StopIteration):
148 pass
149 else:
150 raise RuntimeError("coroutine ignored GeneratorExit")
151
Yury Selivanov75445082015-05-11 22:57:16 -0400152 @classmethod
153 def __subclasshook__(cls, C):
Yury Selivanov56fc6142015-05-29 09:01:29 -0400154 if cls is Coroutine:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700155 return _check_methods(C, '__await__', 'send', 'throw', 'close')
Yury Selivanov75445082015-05-11 22:57:16 -0400156 return NotImplemented
157
Yury Selivanov75445082015-05-11 22:57:16 -0400158
Yury Selivanov5376ba92015-06-22 12:19:30 -0400159Coroutine.register(coroutine)
160
161
Yury Selivanove0104ae2015-05-14 12:19:16 -0400162class AsyncIterable(metaclass=ABCMeta):
163
164 __slots__ = ()
165
166 @abstractmethod
Yury Selivanova6f6edb2016-06-09 15:08:31 -0400167 def __aiter__(self):
Yury Selivanove0104ae2015-05-14 12:19:16 -0400168 return AsyncIterator()
169
170 @classmethod
171 def __subclasshook__(cls, C):
172 if cls is AsyncIterable:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700173 return _check_methods(C, "__aiter__")
Yury Selivanove0104ae2015-05-14 12:19:16 -0400174 return NotImplemented
175
Guido van Rossum48b069a2020-04-07 09:50:06 -0700176 __class_getitem__ = classmethod(GenericAlias)
177
Yury Selivanove0104ae2015-05-14 12:19:16 -0400178
179class AsyncIterator(AsyncIterable):
180
181 __slots__ = ()
182
183 @abstractmethod
184 async def __anext__(self):
185 """Return the next item or raise StopAsyncIteration when exhausted."""
186 raise StopAsyncIteration
187
Yury Selivanova6f6edb2016-06-09 15:08:31 -0400188 def __aiter__(self):
Yury Selivanove0104ae2015-05-14 12:19:16 -0400189 return self
190
191 @classmethod
192 def __subclasshook__(cls, C):
193 if cls is AsyncIterator:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700194 return _check_methods(C, "__anext__", "__aiter__")
Yury Selivanove0104ae2015-05-14 12:19:16 -0400195 return NotImplemented
196
197
Yury Selivanov22214ab2016-11-16 18:25:04 -0500198class AsyncGenerator(AsyncIterator):
199
200 __slots__ = ()
201
202 async def __anext__(self):
203 """Return the next item from the asynchronous generator.
204 When exhausted, raise StopAsyncIteration.
205 """
206 return await self.asend(None)
207
208 @abstractmethod
209 async def asend(self, value):
210 """Send a value into the asynchronous generator.
211 Return next yielded value or raise StopAsyncIteration.
212 """
213 raise StopAsyncIteration
214
215 @abstractmethod
216 async def athrow(self, typ, val=None, tb=None):
217 """Raise an exception in the asynchronous generator.
218 Return next yielded value or raise StopAsyncIteration.
219 """
220 if val is None:
221 if tb is None:
222 raise typ
223 val = typ()
224 if tb is not None:
225 val = val.with_traceback(tb)
226 raise val
227
228 async def aclose(self):
229 """Raise GeneratorExit inside coroutine.
230 """
231 try:
232 await self.athrow(GeneratorExit)
233 except (GeneratorExit, StopAsyncIteration):
234 pass
235 else:
236 raise RuntimeError("asynchronous generator ignored GeneratorExit")
237
238 @classmethod
239 def __subclasshook__(cls, C):
240 if cls is AsyncGenerator:
241 return _check_methods(C, '__aiter__', '__anext__',
242 'asend', 'athrow', 'aclose')
243 return NotImplemented
244
245
246AsyncGenerator.register(async_generator)
247
248
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000249class Iterable(metaclass=ABCMeta):
250
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700251 __slots__ = ()
252
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000253 @abstractmethod
254 def __iter__(self):
255 while False:
256 yield None
257
258 @classmethod
259 def __subclasshook__(cls, C):
260 if cls is Iterable:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700261 return _check_methods(C, "__iter__")
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000262 return NotImplemented
263
Guido van Rossum48b069a2020-04-07 09:50:06 -0700264 __class_getitem__ = classmethod(GenericAlias)
265
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000266
Raymond Hettinger74b64952008-02-09 02:53:48 +0000267class Iterator(Iterable):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000268
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700269 __slots__ = ()
270
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000271 @abstractmethod
272 def __next__(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700273 'Return the next item from the iterator. When exhausted, raise StopIteration'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000274 raise StopIteration
275
276 def __iter__(self):
277 return self
278
279 @classmethod
280 def __subclasshook__(cls, C):
281 if cls is Iterator:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700282 return _check_methods(C, '__iter__', '__next__')
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000283 return NotImplemented
284
Guido van Rossum48b069a2020-04-07 09:50:06 -0700285
Christian Heimesf83be4e2007-11-28 09:44:38 +0000286Iterator.register(bytes_iterator)
287Iterator.register(bytearray_iterator)
288#Iterator.register(callable_iterator)
289Iterator.register(dict_keyiterator)
290Iterator.register(dict_valueiterator)
291Iterator.register(dict_itemiterator)
292Iterator.register(list_iterator)
293Iterator.register(list_reverseiterator)
294Iterator.register(range_iterator)
Serhiy Storchaka48b1c3f2016-10-08 22:04:12 +0300295Iterator.register(longrange_iterator)
Christian Heimesf83be4e2007-11-28 09:44:38 +0000296Iterator.register(set_iterator)
297Iterator.register(str_iterator)
298Iterator.register(tuple_iterator)
299Iterator.register(zip_iterator)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000300
Raymond Hettingerbd60e8d2015-05-09 01:07:23 -0400301
Guido van Rossum16ca06b2016-04-04 10:59:29 -0700302class Reversible(Iterable):
303
304 __slots__ = ()
305
306 @abstractmethod
307 def __reversed__(self):
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700308 while False:
309 yield None
Guido van Rossum16ca06b2016-04-04 10:59:29 -0700310
311 @classmethod
312 def __subclasshook__(cls, C):
313 if cls is Reversible:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700314 return _check_methods(C, "__reversed__", "__iter__")
Guido van Rossum16ca06b2016-04-04 10:59:29 -0700315 return NotImplemented
316
317
Raymond Hettingerbd60e8d2015-05-09 01:07:23 -0400318class Generator(Iterator):
319
320 __slots__ = ()
321
322 def __next__(self):
323 """Return the next item from the generator.
324 When exhausted, raise StopIteration.
325 """
326 return self.send(None)
327
328 @abstractmethod
329 def send(self, value):
330 """Send a value into the generator.
331 Return next yielded value or raise StopIteration.
332 """
333 raise StopIteration
334
335 @abstractmethod
336 def throw(self, typ, val=None, tb=None):
337 """Raise an exception in the generator.
338 Return next yielded value or raise StopIteration.
339 """
340 if val is None:
341 if tb is None:
342 raise typ
343 val = typ()
344 if tb is not None:
345 val = val.with_traceback(tb)
346 raise val
347
348 def close(self):
349 """Raise GeneratorExit inside generator.
350 """
351 try:
352 self.throw(GeneratorExit)
353 except (GeneratorExit, StopIteration):
354 pass
355 else:
356 raise RuntimeError("generator ignored GeneratorExit")
357
358 @classmethod
359 def __subclasshook__(cls, C):
360 if cls is Generator:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700361 return _check_methods(C, '__iter__', '__next__',
362 'send', 'throw', 'close')
Raymond Hettingerbd60e8d2015-05-09 01:07:23 -0400363 return NotImplemented
364
Guido van Rossum48b069a2020-04-07 09:50:06 -0700365
Raymond Hettingerbd60e8d2015-05-09 01:07:23 -0400366Generator.register(generator)
367
368
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000369class Sized(metaclass=ABCMeta):
370
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700371 __slots__ = ()
372
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000373 @abstractmethod
374 def __len__(self):
375 return 0
376
377 @classmethod
378 def __subclasshook__(cls, C):
379 if cls is Sized:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700380 return _check_methods(C, "__len__")
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000381 return NotImplemented
382
383
384class Container(metaclass=ABCMeta):
385
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700386 __slots__ = ()
387
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000388 @abstractmethod
389 def __contains__(self, x):
390 return False
391
392 @classmethod
393 def __subclasshook__(cls, C):
394 if cls is Container:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700395 return _check_methods(C, "__contains__")
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000396 return NotImplemented
397
Guido van Rossum48b069a2020-04-07 09:50:06 -0700398 __class_getitem__ = classmethod(GenericAlias)
399
400
Guido van Rossumf0666942016-08-23 10:47:07 -0700401class Collection(Sized, Iterable, Container):
402
403 __slots__ = ()
404
405 @classmethod
406 def __subclasshook__(cls, C):
407 if cls is Collection:
408 return _check_methods(C, "__len__", "__iter__", "__contains__")
409 return NotImplemented
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000410
Guido van Rossum48b069a2020-04-07 09:50:06 -0700411
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000412class Callable(metaclass=ABCMeta):
413
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700414 __slots__ = ()
415
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000416 @abstractmethod
Christian Heimes78644762008-03-04 23:39:23 +0000417 def __call__(self, *args, **kwds):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000418 return False
419
420 @classmethod
421 def __subclasshook__(cls, C):
422 if cls is Callable:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700423 return _check_methods(C, "__call__")
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000424 return NotImplemented
425
Guido van Rossum48b069a2020-04-07 09:50:06 -0700426 __class_getitem__ = classmethod(GenericAlias)
427
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000428
429### SETS ###
430
431
Guido van Rossumf0666942016-08-23 10:47:07 -0700432class Set(Collection):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000433
434 """A set is a finite, iterable container.
435
436 This class provides concrete generic implementations of all
437 methods except for __contains__, __iter__ and __len__.
438
439 To override the comparisons (presumably for speed, as the
Raymond Hettinger11cda472014-07-03 00:31:30 +0100440 semantics are fixed), redefine __le__ and __ge__,
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000441 then the other operations will automatically follow suit.
442 """
443
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700444 __slots__ = ()
445
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000446 def __le__(self, other):
447 if not isinstance(other, Set):
448 return NotImplemented
449 if len(self) > len(other):
450 return False
451 for elem in self:
452 if elem not in other:
453 return False
454 return True
455
456 def __lt__(self, other):
457 if not isinstance(other, Set):
458 return NotImplemented
459 return len(self) < len(other) and self.__le__(other)
460
Raymond Hettinger71909422008-02-09 00:08:16 +0000461 def __gt__(self, other):
462 if not isinstance(other, Set):
463 return NotImplemented
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700464 return len(self) > len(other) and self.__ge__(other)
Raymond Hettinger71909422008-02-09 00:08:16 +0000465
466 def __ge__(self, other):
467 if not isinstance(other, Set):
468 return NotImplemented
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700469 if len(self) < len(other):
470 return False
471 for elem in other:
472 if elem not in self:
473 return False
474 return True
Raymond Hettinger71909422008-02-09 00:08:16 +0000475
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000476 def __eq__(self, other):
477 if not isinstance(other, Set):
478 return NotImplemented
479 return len(self) == len(other) and self.__le__(other)
480
481 @classmethod
482 def _from_iterable(cls, it):
Raymond Hettinger8284c4a2008-02-06 20:47:09 +0000483 '''Construct an instance of the class from any iterable input.
484
485 Must override this method if the class constructor signature
Raymond Hettinger7aebb642008-02-09 03:25:08 +0000486 does not accept an iterable for an input.
Raymond Hettinger8284c4a2008-02-06 20:47:09 +0000487 '''
Raymond Hettinger7aebb642008-02-09 03:25:08 +0000488 return cls(it)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000489
490 def __and__(self, other):
491 if not isinstance(other, Iterable):
492 return NotImplemented
493 return self._from_iterable(value for value in other if value in self)
494
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700495 __rand__ = __and__
496
Christian Heimes190d79e2008-01-30 11:58:22 +0000497 def isdisjoint(self, other):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700498 'Return True if two sets have a null intersection.'
Christian Heimes190d79e2008-01-30 11:58:22 +0000499 for value in other:
500 if value in self:
501 return False
502 return True
503
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000504 def __or__(self, other):
505 if not isinstance(other, Iterable):
506 return NotImplemented
Christian Heimes78644762008-03-04 23:39:23 +0000507 chain = (e for s in (self, other) for e in s)
508 return self._from_iterable(chain)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000509
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700510 __ror__ = __or__
511
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000512 def __sub__(self, other):
513 if not isinstance(other, Set):
514 if not isinstance(other, Iterable):
515 return NotImplemented
516 other = self._from_iterable(other)
517 return self._from_iterable(value for value in self
518 if value not in other)
519
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700520 def __rsub__(self, other):
521 if not isinstance(other, Set):
522 if not isinstance(other, Iterable):
523 return NotImplemented
524 other = self._from_iterable(other)
525 return self._from_iterable(value for value in other
526 if value not in self)
527
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000528 def __xor__(self, other):
529 if not isinstance(other, Set):
530 if not isinstance(other, Iterable):
531 return NotImplemented
532 other = self._from_iterable(other)
533 return (self - other) | (other - self)
534
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700535 __rxor__ = __xor__
536
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000537 def _hash(self):
538 """Compute the hash value of a set.
539
540 Note that we don't define __hash__: not all sets are hashable.
541 But if you define a hashable set type, its __hash__ should
542 call this function.
543
544 This must be compatible __eq__.
545
546 All sets ought to compare equal if they contain the same
547 elements, regardless of how they are implemented, and
548 regardless of the order of the elements; so there's not much
549 freedom for __eq__ or __hash__. We match the algorithm used
550 by the built-in frozenset type.
551 """
Christian Heimesa37d4c62007-12-04 23:02:19 +0000552 MAX = sys.maxsize
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000553 MASK = 2 * MAX + 1
554 n = len(self)
555 h = 1927868237 * (n + 1)
556 h &= MASK
557 for x in self:
558 hx = hash(x)
559 h ^= (hx ^ (hx << 16) ^ 89869747) * 3644798167
560 h &= MASK
561 h = h * 69069 + 907133923
562 h &= MASK
563 if h > MAX:
564 h -= MASK + 1
565 if h == -1:
566 h = 590923713
567 return h
568
Guido van Rossum48b069a2020-04-07 09:50:06 -0700569
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000570Set.register(frozenset)
571
572
573class MutableSet(Set):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700574 """A mutable set is a finite, iterable container.
575
576 This class provides concrete generic implementations of all
577 methods except for __contains__, __iter__, __len__,
578 add(), and discard().
579
580 To override the comparisons (presumably for speed, as the
581 semantics are fixed), all you have to do is redefine __le__ and
582 then the other operations will automatically follow suit.
583 """
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000584
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700585 __slots__ = ()
586
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000587 @abstractmethod
588 def add(self, value):
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000589 """Add an element."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000590 raise NotImplementedError
591
592 @abstractmethod
593 def discard(self, value):
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000594 """Remove an element. Do not raise an exception if absent."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000595 raise NotImplementedError
596
Christian Heimes190d79e2008-01-30 11:58:22 +0000597 def remove(self, value):
598 """Remove an element. If not a member, raise a KeyError."""
599 if value not in self:
600 raise KeyError(value)
601 self.discard(value)
602
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000603 def pop(self):
604 """Return the popped value. Raise KeyError if empty."""
605 it = iter(self)
606 try:
Raymond Hettingerae650182009-01-28 23:33:59 +0000607 value = next(it)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000608 except StopIteration:
Serhiy Storchaka5affd232017-04-05 09:37:24 +0300609 raise KeyError from None
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000610 self.discard(value)
611 return value
612
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000613 def clear(self):
614 """This is slow (creates N new iterators!) but effective."""
615 try:
616 while True:
617 self.pop()
618 except KeyError:
619 pass
620
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000621 def __ior__(self, it):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000622 for value in it:
623 self.add(value)
624 return self
625
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000626 def __iand__(self, it):
Raymond Hettinger3f10a952009-04-01 19:05:50 +0000627 for value in (self - it):
628 self.discard(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000629 return self
630
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000631 def __ixor__(self, it):
Daniel Stutzbach31da5b22010-08-24 20:49:57 +0000632 if it is self:
633 self.clear()
634 else:
635 if not isinstance(it, Set):
636 it = self._from_iterable(it)
637 for value in it:
638 if value in self:
639 self.discard(value)
640 else:
641 self.add(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000642 return self
643
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000644 def __isub__(self, it):
Daniel Stutzbach31da5b22010-08-24 20:49:57 +0000645 if it is self:
646 self.clear()
647 else:
648 for value in it:
649 self.discard(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000650 return self
651
Guido van Rossum48b069a2020-04-07 09:50:06 -0700652
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000653MutableSet.register(set)
654
655
656### MAPPINGS ###
657
658
Guido van Rossumf0666942016-08-23 10:47:07 -0700659class Mapping(Collection):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000660
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700661 __slots__ = ()
662
Raymond Hettinger153866e2013-03-24 15:20:29 -0700663 """A Mapping is a generic container for associating key/value
664 pairs.
665
666 This class provides concrete generic implementations of all
667 methods except for __getitem__, __iter__, and __len__.
668
669 """
670
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000671 @abstractmethod
672 def __getitem__(self, key):
673 raise KeyError
674
675 def get(self, key, default=None):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700676 'D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000677 try:
678 return self[key]
679 except KeyError:
680 return default
681
682 def __contains__(self, key):
683 try:
684 self[key]
685 except KeyError:
686 return False
687 else:
688 return True
689
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000690 def keys(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700691 "D.keys() -> a set-like object providing a view on D's keys"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000692 return KeysView(self)
693
694 def items(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700695 "D.items() -> a set-like object providing a view on D's items"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000696 return ItemsView(self)
697
698 def values(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700699 "D.values() -> an object providing a view on D's values"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000700 return ValuesView(self)
701
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000702 def __eq__(self, other):
Benjamin Peterson4ad6bd52010-05-21 20:55:22 +0000703 if not isinstance(other, Mapping):
704 return NotImplemented
705 return dict(self.items()) == dict(other.items())
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000706
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700707 __reversed__ = None
708
Guido van Rossum48b069a2020-04-07 09:50:06 -0700709
Victor Stinner7b17a4e2012-04-20 01:41:36 +0200710Mapping.register(mappingproxy)
711
Christian Heimes2202f872008-02-06 14:31:34 +0000712
Raymond Hettingerbfd06122008-02-09 10:04:32 +0000713class MappingView(Sized):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000714
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700715 __slots__ = '_mapping',
716
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000717 def __init__(self, mapping):
718 self._mapping = mapping
719
720 def __len__(self):
721 return len(self._mapping)
722
Raymond Hettinger89fc2b72009-02-27 07:47:32 +0000723 def __repr__(self):
724 return '{0.__class__.__name__}({0._mapping!r})'.format(self)
725
Guido van Rossum48b069a2020-04-07 09:50:06 -0700726 __class_getitem__ = classmethod(GenericAlias)
727
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000728
729class KeysView(MappingView, Set):
730
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700731 __slots__ = ()
732
Raymond Hettinger9117c752010-08-22 07:44:24 +0000733 @classmethod
734 def _from_iterable(self, it):
735 return set(it)
736
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000737 def __contains__(self, key):
738 return key in self._mapping
739
740 def __iter__(self):
Philip Jenvey4993cc02012-10-01 12:53:43 -0700741 yield from self._mapping
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000742
Guido van Rossum48b069a2020-04-07 09:50:06 -0700743
Christian Heimesf83be4e2007-11-28 09:44:38 +0000744KeysView.register(dict_keys)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000745
746
747class ItemsView(MappingView, Set):
748
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700749 __slots__ = ()
750
Raymond Hettinger9117c752010-08-22 07:44:24 +0000751 @classmethod
752 def _from_iterable(self, it):
753 return set(it)
754
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000755 def __contains__(self, item):
756 key, value = item
757 try:
758 v = self._mapping[key]
759 except KeyError:
760 return False
761 else:
Raymond Hettinger584e8ae2016-05-05 11:14:06 +0300762 return v is value or v == value
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000763
764 def __iter__(self):
765 for key in self._mapping:
766 yield (key, self._mapping[key])
767
Guido van Rossum48b069a2020-04-07 09:50:06 -0700768
Christian Heimesf83be4e2007-11-28 09:44:38 +0000769ItemsView.register(dict_items)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000770
771
Raymond Hettinger02556fb2018-01-11 21:53:49 -0800772class ValuesView(MappingView, Collection):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000773
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700774 __slots__ = ()
775
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000776 def __contains__(self, value):
777 for key in self._mapping:
Raymond Hettinger584e8ae2016-05-05 11:14:06 +0300778 v = self._mapping[key]
779 if v is value or v == value:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000780 return True
781 return False
782
783 def __iter__(self):
784 for key in self._mapping:
785 yield self._mapping[key]
786
Guido van Rossum48b069a2020-04-07 09:50:06 -0700787
Christian Heimesf83be4e2007-11-28 09:44:38 +0000788ValuesView.register(dict_values)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000789
790
791class MutableMapping(Mapping):
792
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700793 __slots__ = ()
794
Raymond Hettinger153866e2013-03-24 15:20:29 -0700795 """A MutableMapping is a generic container for associating
796 key/value pairs.
797
798 This class provides concrete generic implementations of all
799 methods except for __getitem__, __setitem__, __delitem__,
800 __iter__, and __len__.
801
802 """
803
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000804 @abstractmethod
805 def __setitem__(self, key, value):
806 raise KeyError
807
808 @abstractmethod
809 def __delitem__(self, key):
810 raise KeyError
811
812 __marker = object()
813
814 def pop(self, key, default=__marker):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700815 '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
816 If key is not found, d is returned if given, otherwise KeyError is raised.
817 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000818 try:
819 value = self[key]
820 except KeyError:
821 if default is self.__marker:
822 raise
823 return default
824 else:
825 del self[key]
826 return value
827
828 def popitem(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700829 '''D.popitem() -> (k, v), remove and return some (key, value) pair
830 as a 2-tuple; but raise KeyError if D is empty.
831 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000832 try:
833 key = next(iter(self))
834 except StopIteration:
Serhiy Storchaka5affd232017-04-05 09:37:24 +0300835 raise KeyError from None
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000836 value = self[key]
837 del self[key]
838 return key, value
839
840 def clear(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700841 'D.clear() -> None. Remove all items from D.'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000842 try:
843 while True:
844 self.popitem()
845 except KeyError:
846 pass
847
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300848 def update(self, other=(), /, **kwds):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700849 ''' D.update([E, ]**F) -> None. Update D from mapping/iterable E and F.
850 If E present and has a .keys() method, does: for k in E: D[k] = E[k]
851 If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v
852 In either case, this is followed by: for k, v in F.items(): D[k] = v
853 '''
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300854 if isinstance(other, Mapping):
855 for key in other:
856 self[key] = other[key]
857 elif hasattr(other, "keys"):
858 for key in other.keys():
859 self[key] = other[key]
860 else:
861 for key, value in other:
862 self[key] = value
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000863 for key, value in kwds.items():
864 self[key] = value
865
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000866 def setdefault(self, key, default=None):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700867 '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 +0000868 try:
869 return self[key]
870 except KeyError:
871 self[key] = default
872 return default
873
Guido van Rossum48b069a2020-04-07 09:50:06 -0700874
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000875MutableMapping.register(dict)
876
877
878### SEQUENCES ###
879
880
Guido van Rossumf0666942016-08-23 10:47:07 -0700881class Sequence(Reversible, Collection):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000882
883 """All the operations on a read-only sequence.
884
885 Concrete subclasses must override __new__ or __init__,
886 __getitem__, and __len__.
887 """
888
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700889 __slots__ = ()
890
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000891 @abstractmethod
892 def __getitem__(self, index):
893 raise IndexError
894
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000895 def __iter__(self):
896 i = 0
Raymond Hettinger71909422008-02-09 00:08:16 +0000897 try:
898 while True:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000899 v = self[i]
Raymond Hettinger71909422008-02-09 00:08:16 +0000900 yield v
901 i += 1
902 except IndexError:
903 return
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000904
905 def __contains__(self, value):
906 for v in self:
Raymond Hettinger584e8ae2016-05-05 11:14:06 +0300907 if v is value or v == value:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000908 return True
909 return False
910
911 def __reversed__(self):
912 for i in reversed(range(len(self))):
913 yield self[i]
914
Raymond Hettingerec219ba2015-05-22 19:29:22 -0700915 def index(self, value, start=0, stop=None):
916 '''S.index(value, [start, [stop]]) -> integer -- return first index of value.
Raymond Hettinger153866e2013-03-24 15:20:29 -0700917 Raises ValueError if the value is not present.
Nitish Chandra5ce0a2a2017-12-12 15:52:30 +0530918
919 Supporting start and stop arguments is optional, but
920 recommended.
Raymond Hettinger153866e2013-03-24 15:20:29 -0700921 '''
Raymond Hettingerec219ba2015-05-22 19:29:22 -0700922 if start is not None and start < 0:
923 start = max(len(self) + start, 0)
924 if stop is not None and stop < 0:
925 stop += len(self)
926
927 i = start
928 while stop is None or i < stop:
929 try:
Xiang Zhangd5d32492017-03-08 11:04:24 +0800930 v = self[i]
931 if v is value or v == value:
Raymond Hettingerec219ba2015-05-22 19:29:22 -0700932 return i
933 except IndexError:
934 break
935 i += 1
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000936 raise ValueError
937
938 def count(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700939 'S.count(value) -> integer -- return number of occurrences of value'
Xiang Zhangd5d32492017-03-08 11:04:24 +0800940 return sum(1 for v in self if v is value or v == value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000941
Guido van Rossum48b069a2020-04-07 09:50:06 -0700942
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000943Sequence.register(tuple)
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000944Sequence.register(str)
Raymond Hettinger9aa53c22009-02-24 11:25:35 +0000945Sequence.register(range)
Nick Coghlan45163cc2013-10-02 22:31:47 +1000946Sequence.register(memoryview)
Guido van Rossumd05eb002007-11-21 22:26:24 +0000947
948
949class ByteString(Sequence):
950
951 """This unifies bytes and bytearray.
952
953 XXX Should add all their methods.
954 """
955
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700956 __slots__ = ()
957
Guido van Rossumd05eb002007-11-21 22:26:24 +0000958ByteString.register(bytes)
959ByteString.register(bytearray)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000960
961
962class MutableSequence(Sequence):
963
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700964 __slots__ = ()
965
Guido van Rossum840c3102013-07-25 11:55:41 -0700966 """All the operations on a read-write sequence.
Raymond Hettinger153866e2013-03-24 15:20:29 -0700967
968 Concrete subclasses must provide __new__ or __init__,
969 __getitem__, __setitem__, __delitem__, __len__, and insert().
970
971 """
972
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000973 @abstractmethod
974 def __setitem__(self, index, value):
975 raise IndexError
976
977 @abstractmethod
978 def __delitem__(self, index):
979 raise IndexError
980
981 @abstractmethod
982 def insert(self, index, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700983 'S.insert(index, value) -- insert value before index'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000984 raise IndexError
985
986 def append(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700987 'S.append(value) -- append value to the end of the sequence'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000988 self.insert(len(self), value)
989
Eli Bendersky9479d1a2011-03-04 05:34:58 +0000990 def clear(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700991 'S.clear() -> None -- remove all items from S'
Eli Bendersky9479d1a2011-03-04 05:34:58 +0000992 try:
993 while True:
994 self.pop()
995 except IndexError:
996 pass
997
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000998 def reverse(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700999 'S.reverse() -- reverse *IN PLACE*'
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001000 n = len(self)
1001 for i in range(n//2):
1002 self[i], self[n-i-1] = self[n-i-1], self[i]
1003
1004 def extend(self, values):
Raymond Hettinger153866e2013-03-24 15:20:29 -07001005 'S.extend(iterable) -- extend sequence by appending elements from the iterable'
Naris R1b5f9c92018-08-31 02:56:14 +10001006 if values is self:
1007 values = list(values)
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001008 for v in values:
1009 self.append(v)
1010
1011 def pop(self, index=-1):
Raymond Hettinger153866e2013-03-24 15:20:29 -07001012 '''S.pop([index]) -> item -- remove and return item at index (default last).
1013 Raise IndexError if list is empty or index is out of range.
1014 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001015 v = self[index]
1016 del self[index]
1017 return v
1018
1019 def remove(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -07001020 '''S.remove(value) -- remove first occurrence of value.
1021 Raise ValueError if the value is not present.
1022 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001023 del self[self.index(value)]
1024
1025 def __iadd__(self, values):
1026 self.extend(values)
Raymond Hettingerc384b222009-05-18 15:35:26 +00001027 return self
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001028
Guido van Rossum48b069a2020-04-07 09:50:06 -07001029
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001030MutableSequence.register(list)
Guido van Rossumd05eb002007-11-21 22:26:24 +00001031MutableSequence.register(bytearray) # Multiply inheriting, see ByteString