blob: 28690f8c0bdc5c081d9c9f74eb5e98d04c276297 [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 """A set is a finite, iterable container.
434
435 This class provides concrete generic implementations of all
436 methods except for __contains__, __iter__ and __len__.
437
438 To override the comparisons (presumably for speed, as the
Raymond Hettinger11cda472014-07-03 00:31:30 +0100439 semantics are fixed), redefine __le__ and __ge__,
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000440 then the other operations will automatically follow suit.
441 """
442
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700443 __slots__ = ()
444
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000445 def __le__(self, other):
446 if not isinstance(other, Set):
447 return NotImplemented
448 if len(self) > len(other):
449 return False
450 for elem in self:
451 if elem not in other:
452 return False
453 return True
454
455 def __lt__(self, other):
456 if not isinstance(other, Set):
457 return NotImplemented
458 return len(self) < len(other) and self.__le__(other)
459
Raymond Hettinger71909422008-02-09 00:08:16 +0000460 def __gt__(self, other):
461 if not isinstance(other, Set):
462 return NotImplemented
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700463 return len(self) > len(other) and self.__ge__(other)
Raymond Hettinger71909422008-02-09 00:08:16 +0000464
465 def __ge__(self, other):
466 if not isinstance(other, Set):
467 return NotImplemented
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700468 if len(self) < len(other):
469 return False
470 for elem in other:
471 if elem not in self:
472 return False
473 return True
Raymond Hettinger71909422008-02-09 00:08:16 +0000474
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000475 def __eq__(self, other):
476 if not isinstance(other, Set):
477 return NotImplemented
478 return len(self) == len(other) and self.__le__(other)
479
480 @classmethod
481 def _from_iterable(cls, it):
Raymond Hettinger8284c4a2008-02-06 20:47:09 +0000482 '''Construct an instance of the class from any iterable input.
483
484 Must override this method if the class constructor signature
Raymond Hettinger7aebb642008-02-09 03:25:08 +0000485 does not accept an iterable for an input.
Raymond Hettinger8284c4a2008-02-06 20:47:09 +0000486 '''
Raymond Hettinger7aebb642008-02-09 03:25:08 +0000487 return cls(it)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000488
489 def __and__(self, other):
490 if not isinstance(other, Iterable):
491 return NotImplemented
492 return self._from_iterable(value for value in other if value in self)
493
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700494 __rand__ = __and__
495
Christian Heimes190d79e2008-01-30 11:58:22 +0000496 def isdisjoint(self, other):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700497 'Return True if two sets have a null intersection.'
Christian Heimes190d79e2008-01-30 11:58:22 +0000498 for value in other:
499 if value in self:
500 return False
501 return True
502
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000503 def __or__(self, other):
504 if not isinstance(other, Iterable):
505 return NotImplemented
Christian Heimes78644762008-03-04 23:39:23 +0000506 chain = (e for s in (self, other) for e in s)
507 return self._from_iterable(chain)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000508
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700509 __ror__ = __or__
510
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000511 def __sub__(self, other):
512 if not isinstance(other, Set):
513 if not isinstance(other, Iterable):
514 return NotImplemented
515 other = self._from_iterable(other)
516 return self._from_iterable(value for value in self
517 if value not in other)
518
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700519 def __rsub__(self, other):
520 if not isinstance(other, Set):
521 if not isinstance(other, Iterable):
522 return NotImplemented
523 other = self._from_iterable(other)
524 return self._from_iterable(value for value in other
525 if value not in self)
526
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000527 def __xor__(self, other):
528 if not isinstance(other, Set):
529 if not isinstance(other, Iterable):
530 return NotImplemented
531 other = self._from_iterable(other)
532 return (self - other) | (other - self)
533
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700534 __rxor__ = __xor__
535
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000536 def _hash(self):
537 """Compute the hash value of a set.
538
539 Note that we don't define __hash__: not all sets are hashable.
540 But if you define a hashable set type, its __hash__ should
541 call this function.
542
543 This must be compatible __eq__.
544
545 All sets ought to compare equal if they contain the same
546 elements, regardless of how they are implemented, and
547 regardless of the order of the elements; so there's not much
548 freedom for __eq__ or __hash__. We match the algorithm used
549 by the built-in frozenset type.
550 """
Christian Heimesa37d4c62007-12-04 23:02:19 +0000551 MAX = sys.maxsize
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000552 MASK = 2 * MAX + 1
553 n = len(self)
554 h = 1927868237 * (n + 1)
555 h &= MASK
556 for x in self:
557 hx = hash(x)
558 h ^= (hx ^ (hx << 16) ^ 89869747) * 3644798167
559 h &= MASK
560 h = h * 69069 + 907133923
561 h &= MASK
562 if h > MAX:
563 h -= MASK + 1
564 if h == -1:
565 h = 590923713
566 return h
567
Guido van Rossum48b069a2020-04-07 09:50:06 -0700568
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000569Set.register(frozenset)
570
571
572class MutableSet(Set):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700573 """A mutable set is a finite, iterable container.
574
575 This class provides concrete generic implementations of all
576 methods except for __contains__, __iter__, __len__,
577 add(), and discard().
578
579 To override the comparisons (presumably for speed, as the
580 semantics are fixed), all you have to do is redefine __le__ and
581 then the other operations will automatically follow suit.
582 """
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000583
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700584 __slots__ = ()
585
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000586 @abstractmethod
587 def add(self, value):
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000588 """Add an element."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000589 raise NotImplementedError
590
591 @abstractmethod
592 def discard(self, value):
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000593 """Remove an element. Do not raise an exception if absent."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000594 raise NotImplementedError
595
Christian Heimes190d79e2008-01-30 11:58:22 +0000596 def remove(self, value):
597 """Remove an element. If not a member, raise a KeyError."""
598 if value not in self:
599 raise KeyError(value)
600 self.discard(value)
601
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000602 def pop(self):
603 """Return the popped value. Raise KeyError if empty."""
604 it = iter(self)
605 try:
Raymond Hettingerae650182009-01-28 23:33:59 +0000606 value = next(it)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000607 except StopIteration:
Serhiy Storchaka5affd232017-04-05 09:37:24 +0300608 raise KeyError from None
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000609 self.discard(value)
610 return value
611
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000612 def clear(self):
613 """This is slow (creates N new iterators!) but effective."""
614 try:
615 while True:
616 self.pop()
617 except KeyError:
618 pass
619
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000620 def __ior__(self, it):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000621 for value in it:
622 self.add(value)
623 return self
624
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000625 def __iand__(self, it):
Raymond Hettinger3f10a952009-04-01 19:05:50 +0000626 for value in (self - it):
627 self.discard(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000628 return self
629
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000630 def __ixor__(self, it):
Daniel Stutzbach31da5b22010-08-24 20:49:57 +0000631 if it is self:
632 self.clear()
633 else:
634 if not isinstance(it, Set):
635 it = self._from_iterable(it)
636 for value in it:
637 if value in self:
638 self.discard(value)
639 else:
640 self.add(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000641 return self
642
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000643 def __isub__(self, it):
Daniel Stutzbach31da5b22010-08-24 20:49:57 +0000644 if it is self:
645 self.clear()
646 else:
647 for value in it:
648 self.discard(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000649 return self
650
Guido van Rossum48b069a2020-04-07 09:50:06 -0700651
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000652MutableSet.register(set)
653
654
655### MAPPINGS ###
656
657
Guido van Rossumf0666942016-08-23 10:47:07 -0700658class Mapping(Collection):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700659 """A Mapping is a generic container for associating key/value
660 pairs.
661
662 This class provides concrete generic implementations of all
663 methods except for __getitem__, __iter__, and __len__.
Raymond Hettinger153866e2013-03-24 15:20:29 -0700664 """
665
Julien Palard282282a2020-11-17 22:50:23 +0100666 __slots__ = ()
667
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000668 @abstractmethod
669 def __getitem__(self, key):
670 raise KeyError
671
672 def get(self, key, default=None):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700673 'D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000674 try:
675 return self[key]
676 except KeyError:
677 return default
678
679 def __contains__(self, key):
680 try:
681 self[key]
682 except KeyError:
683 return False
684 else:
685 return True
686
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000687 def keys(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700688 "D.keys() -> a set-like object providing a view on D's keys"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000689 return KeysView(self)
690
691 def items(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700692 "D.items() -> a set-like object providing a view on D's items"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000693 return ItemsView(self)
694
695 def values(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700696 "D.values() -> an object providing a view on D's values"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000697 return ValuesView(self)
698
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000699 def __eq__(self, other):
Benjamin Peterson4ad6bd52010-05-21 20:55:22 +0000700 if not isinstance(other, Mapping):
701 return NotImplemented
702 return dict(self.items()) == dict(other.items())
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000703
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700704 __reversed__ = None
705
Guido van Rossum48b069a2020-04-07 09:50:06 -0700706
Victor Stinner7b17a4e2012-04-20 01:41:36 +0200707Mapping.register(mappingproxy)
708
Christian Heimes2202f872008-02-06 14:31:34 +0000709
Raymond Hettingerbfd06122008-02-09 10:04:32 +0000710class MappingView(Sized):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000711
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700712 __slots__ = '_mapping',
713
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000714 def __init__(self, mapping):
715 self._mapping = mapping
716
717 def __len__(self):
718 return len(self._mapping)
719
Raymond Hettinger89fc2b72009-02-27 07:47:32 +0000720 def __repr__(self):
721 return '{0.__class__.__name__}({0._mapping!r})'.format(self)
722
Guido van Rossum48b069a2020-04-07 09:50:06 -0700723 __class_getitem__ = classmethod(GenericAlias)
724
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000725
726class KeysView(MappingView, Set):
727
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700728 __slots__ = ()
729
Raymond Hettinger9117c752010-08-22 07:44:24 +0000730 @classmethod
731 def _from_iterable(self, it):
732 return set(it)
733
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000734 def __contains__(self, key):
735 return key in self._mapping
736
737 def __iter__(self):
Philip Jenvey4993cc02012-10-01 12:53:43 -0700738 yield from self._mapping
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000739
Guido van Rossum48b069a2020-04-07 09:50:06 -0700740
Christian Heimesf83be4e2007-11-28 09:44:38 +0000741KeysView.register(dict_keys)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000742
743
744class ItemsView(MappingView, Set):
745
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700746 __slots__ = ()
747
Raymond Hettinger9117c752010-08-22 07:44:24 +0000748 @classmethod
749 def _from_iterable(self, it):
750 return set(it)
751
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000752 def __contains__(self, item):
753 key, value = item
754 try:
755 v = self._mapping[key]
756 except KeyError:
757 return False
758 else:
Raymond Hettinger584e8ae2016-05-05 11:14:06 +0300759 return v is value or v == value
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000760
761 def __iter__(self):
762 for key in self._mapping:
763 yield (key, self._mapping[key])
764
Guido van Rossum48b069a2020-04-07 09:50:06 -0700765
Christian Heimesf83be4e2007-11-28 09:44:38 +0000766ItemsView.register(dict_items)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000767
768
Raymond Hettinger02556fb2018-01-11 21:53:49 -0800769class ValuesView(MappingView, Collection):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000770
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700771 __slots__ = ()
772
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000773 def __contains__(self, value):
774 for key in self._mapping:
Raymond Hettinger584e8ae2016-05-05 11:14:06 +0300775 v = self._mapping[key]
776 if v is value or v == value:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000777 return True
778 return False
779
780 def __iter__(self):
781 for key in self._mapping:
782 yield self._mapping[key]
783
Guido van Rossum48b069a2020-04-07 09:50:06 -0700784
Christian Heimesf83be4e2007-11-28 09:44:38 +0000785ValuesView.register(dict_values)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000786
787
788class MutableMapping(Mapping):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700789 """A MutableMapping is a generic container for associating
790 key/value pairs.
791
792 This class provides concrete generic implementations of all
793 methods except for __getitem__, __setitem__, __delitem__,
794 __iter__, and __len__.
Raymond Hettinger153866e2013-03-24 15:20:29 -0700795 """
796
Julien Palard282282a2020-11-17 22:50:23 +0100797 __slots__ = ()
798
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000799 @abstractmethod
800 def __setitem__(self, key, value):
801 raise KeyError
802
803 @abstractmethod
804 def __delitem__(self, key):
805 raise KeyError
806
807 __marker = object()
808
809 def pop(self, key, default=__marker):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700810 '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
811 If key is not found, d is returned if given, otherwise KeyError is raised.
812 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000813 try:
814 value = self[key]
815 except KeyError:
816 if default is self.__marker:
817 raise
818 return default
819 else:
820 del self[key]
821 return value
822
823 def popitem(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700824 '''D.popitem() -> (k, v), remove and return some (key, value) pair
825 as a 2-tuple; but raise KeyError if D is empty.
826 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000827 try:
828 key = next(iter(self))
829 except StopIteration:
Serhiy Storchaka5affd232017-04-05 09:37:24 +0300830 raise KeyError from None
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000831 value = self[key]
832 del self[key]
833 return key, value
834
835 def clear(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700836 'D.clear() -> None. Remove all items from D.'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000837 try:
838 while True:
839 self.popitem()
840 except KeyError:
841 pass
842
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300843 def update(self, other=(), /, **kwds):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700844 ''' D.update([E, ]**F) -> None. Update D from mapping/iterable E and F.
845 If E present and has a .keys() method, does: for k in E: D[k] = E[k]
846 If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v
847 In either case, this is followed by: for k, v in F.items(): D[k] = v
848 '''
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300849 if isinstance(other, Mapping):
850 for key in other:
851 self[key] = other[key]
852 elif hasattr(other, "keys"):
853 for key in other.keys():
854 self[key] = other[key]
855 else:
856 for key, value in other:
857 self[key] = value
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000858 for key, value in kwds.items():
859 self[key] = value
860
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000861 def setdefault(self, key, default=None):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700862 '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 +0000863 try:
864 return self[key]
865 except KeyError:
866 self[key] = default
867 return default
868
Guido van Rossum48b069a2020-04-07 09:50:06 -0700869
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000870MutableMapping.register(dict)
871
872
873### SEQUENCES ###
874
875
Guido van Rossumf0666942016-08-23 10:47:07 -0700876class Sequence(Reversible, Collection):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000877 """All the operations on a read-only sequence.
878
879 Concrete subclasses must override __new__ or __init__,
880 __getitem__, and __len__.
881 """
882
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700883 __slots__ = ()
884
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000885 @abstractmethod
886 def __getitem__(self, index):
887 raise IndexError
888
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000889 def __iter__(self):
890 i = 0
Raymond Hettinger71909422008-02-09 00:08:16 +0000891 try:
892 while True:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000893 v = self[i]
Raymond Hettinger71909422008-02-09 00:08:16 +0000894 yield v
895 i += 1
896 except IndexError:
897 return
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000898
899 def __contains__(self, value):
900 for v in self:
Raymond Hettinger584e8ae2016-05-05 11:14:06 +0300901 if v is value or v == value:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000902 return True
903 return False
904
905 def __reversed__(self):
906 for i in reversed(range(len(self))):
907 yield self[i]
908
Raymond Hettingerec219ba2015-05-22 19:29:22 -0700909 def index(self, value, start=0, stop=None):
910 '''S.index(value, [start, [stop]]) -> integer -- return first index of value.
Raymond Hettinger153866e2013-03-24 15:20:29 -0700911 Raises ValueError if the value is not present.
Nitish Chandra5ce0a2a2017-12-12 15:52:30 +0530912
913 Supporting start and stop arguments is optional, but
914 recommended.
Raymond Hettinger153866e2013-03-24 15:20:29 -0700915 '''
Raymond Hettingerec219ba2015-05-22 19:29:22 -0700916 if start is not None and start < 0:
917 start = max(len(self) + start, 0)
918 if stop is not None and stop < 0:
919 stop += len(self)
920
921 i = start
922 while stop is None or i < stop:
923 try:
Xiang Zhangd5d32492017-03-08 11:04:24 +0800924 v = self[i]
925 if v is value or v == value:
Raymond Hettingerec219ba2015-05-22 19:29:22 -0700926 return i
927 except IndexError:
928 break
929 i += 1
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000930 raise ValueError
931
932 def count(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700933 'S.count(value) -> integer -- return number of occurrences of value'
Xiang Zhangd5d32492017-03-08 11:04:24 +0800934 return sum(1 for v in self if v is value or v == value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000935
Guido van Rossum48b069a2020-04-07 09:50:06 -0700936
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000937Sequence.register(tuple)
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000938Sequence.register(str)
Raymond Hettinger9aa53c22009-02-24 11:25:35 +0000939Sequence.register(range)
Nick Coghlan45163cc2013-10-02 22:31:47 +1000940Sequence.register(memoryview)
Guido van Rossumd05eb002007-11-21 22:26:24 +0000941
942
943class ByteString(Sequence):
Guido van Rossumd05eb002007-11-21 22:26:24 +0000944 """This unifies bytes and bytearray.
945
946 XXX Should add all their methods.
947 """
948
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700949 __slots__ = ()
950
Guido van Rossumd05eb002007-11-21 22:26:24 +0000951ByteString.register(bytes)
952ByteString.register(bytearray)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000953
954
955class MutableSequence(Sequence):
Guido van Rossum840c3102013-07-25 11:55:41 -0700956 """All the operations on a read-write sequence.
Raymond Hettinger153866e2013-03-24 15:20:29 -0700957
958 Concrete subclasses must provide __new__ or __init__,
959 __getitem__, __setitem__, __delitem__, __len__, and insert().
Raymond Hettinger153866e2013-03-24 15:20:29 -0700960 """
961
Julien Palard282282a2020-11-17 22:50:23 +0100962 __slots__ = ()
963
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000964 @abstractmethod
965 def __setitem__(self, index, value):
966 raise IndexError
967
968 @abstractmethod
969 def __delitem__(self, index):
970 raise IndexError
971
972 @abstractmethod
973 def insert(self, index, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700974 'S.insert(index, value) -- insert value before index'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000975 raise IndexError
976
977 def append(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700978 'S.append(value) -- append value to the end of the sequence'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000979 self.insert(len(self), value)
980
Eli Bendersky9479d1a2011-03-04 05:34:58 +0000981 def clear(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700982 'S.clear() -> None -- remove all items from S'
Eli Bendersky9479d1a2011-03-04 05:34:58 +0000983 try:
984 while True:
985 self.pop()
986 except IndexError:
987 pass
988
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000989 def reverse(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700990 'S.reverse() -- reverse *IN PLACE*'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000991 n = len(self)
992 for i in range(n//2):
993 self[i], self[n-i-1] = self[n-i-1], self[i]
994
995 def extend(self, values):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700996 'S.extend(iterable) -- extend sequence by appending elements from the iterable'
Naris R1b5f9c92018-08-31 02:56:14 +1000997 if values is self:
998 values = list(values)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000999 for v in values:
1000 self.append(v)
1001
1002 def pop(self, index=-1):
Raymond Hettinger153866e2013-03-24 15:20:29 -07001003 '''S.pop([index]) -> item -- remove and return item at index (default last).
1004 Raise IndexError if list is empty or index is out of range.
1005 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001006 v = self[index]
1007 del self[index]
1008 return v
1009
1010 def remove(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -07001011 '''S.remove(value) -- remove first occurrence of value.
1012 Raise ValueError if the value is not present.
1013 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001014 del self[self.index(value)]
1015
1016 def __iadd__(self, values):
1017 self.extend(values)
Raymond Hettingerc384b222009-05-18 15:35:26 +00001018 return self
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001019
Guido van Rossum48b069a2020-04-07 09:50:06 -07001020
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001021MutableSequence.register(list)
Guido van Rossumd05eb002007-11-21 22:26:24 +00001022MutableSequence.register(bytearray) # Multiply inheriting, see ByteString