python (3.12.0)
1 # 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
6 Unit tests are in test_collections.
7 """
8
9 ############ Maintenance notes #########################################
10 #
11 # ABCs are different from other standard library modules in that they
12 # specify compliance tests. In general, once an ABC has been published,
13 # new methods (either abstract or concrete) cannot be added.
14 #
15 # Though classes that inherit from an ABC would automatically receive a
16 # new mixin method, registered classes would become non-compliant and
17 # violate the contract promised by ``isinstance(someobj, SomeABC)``.
18 #
19 # Though irritating, the correct procedure for adding new abstract or
20 # mixin methods is to create a new ABC as a subclass of the previous
21 # ABC. For example, union(), intersection(), and difference() cannot
22 # be added to Set but could go into a new ABC that extends Set.
23 #
24 # Because they are so hard to change, new ABCs should have their APIs
25 # carefully thought through prior to publication.
26 #
27 # Since ABCMeta only checks for the presence of methods, it is possible
28 # to alter the signature of a method by adding optional arguments
29 # or changing parameters names. This is still a bit dubious but at
30 # least it won't cause isinstance() to return an incorrect result.
31 #
32 #
33 #######################################################################
34
35 from abc import ABCMeta, abstractmethod
36 import sys
37
38 GenericAlias = type(list[int])
39 EllipsisType = type(...)
40 def _f(): pass
41 FunctionType = type(_f)
42 del _f
43
44 __all__ = ["Awaitable", "Coroutine",
45 "AsyncIterable", "AsyncIterator", "AsyncGenerator",
46 "Hashable", "Iterable", "Iterator", "Generator", "Reversible",
47 "Sized", "Container", "Callable", "Collection",
48 "Set", "MutableSet",
49 "Mapping", "MutableMapping",
50 "MappingView", "KeysView", "ItemsView", "ValuesView",
51 "Sequence", "MutableSequence",
52 "ByteString", "Buffer",
53 ]
54
55 # This module has been renamed from collections.abc to _collections_abc to
56 # speed up interpreter startup. Some of the types such as MutableMapping are
57 # required early but collections module imports a lot of other modules.
58 # See issue #19218
59 __name__ = "collections.abc"
60
61 # Private list of types that we want to register with the various ABCs
62 # so that they will pass tests like:
63 # it = iter(somebytearray)
64 # assert isinstance(it, Iterable)
65 # Note: in other implementations, these types might not be distinct
66 # and they may have their own implementation specific types that
67 # are not included on this list.
68 bytes_iterator = type(iter(b''))
69 bytearray_iterator = type(iter(bytearray()))
70 #callable_iterator = ???
71 dict_keyiterator = type(iter({}.keys()))
72 dict_valueiterator = type(iter({}.values()))
73 dict_itemiterator = type(iter({}.items()))
74 list_iterator = type(iter([]))
75 list_reverseiterator = type(iter(reversed([])))
76 range_iterator = type(iter(range(0)))
77 longrange_iterator = type(iter(range(1 << 1000)))
78 set_iterator = type(iter(set()))
79 str_iterator = type(iter(""))
80 tuple_iterator = type(iter(()))
81 zip_iterator = type(iter(zip()))
82 ## views ##
83 dict_keys = type({}.keys())
84 dict_values = type({}.values())
85 dict_items = type({}.items())
86 ## misc ##
87 mappingproxy = type(type.__dict__)
88 generator = type((lambda: (yield))())
89 ## coroutine ##
90 async def _coro(): pass
91 _coro = _coro()
92 coroutine = type(_coro)
93 _coro.close() # Prevent ResourceWarning
94 del _coro
95 ## asynchronous generator ##
96 async def _ag(): yield
97 _ag = _ag()
98 async_generator = type(_ag)
99 del _ag
100
101
102 ### ONE-TRICK PONIES ###
103
104 def _check_methods(C, *methods):
105 mro = C.__mro__
106 for method in methods:
107 for B in mro:
108 if method in B.__dict__:
109 if B.__dict__[method] is None:
110 return NotImplemented
111 break
112 else:
113 return NotImplemented
114 return True
115
116 class ESC[4;38;5;81mHashable(metaclass=ESC[4;38;5;149mABCMeta):
117
118 __slots__ = ()
119
120 @abstractmethod
121 def __hash__(self):
122 return 0
123
124 @classmethod
125 def __subclasshook__(cls, C):
126 if cls is Hashable:
127 return _check_methods(C, "__hash__")
128 return NotImplemented
129
130
131 class ESC[4;38;5;81mAwaitable(metaclass=ESC[4;38;5;149mABCMeta):
132
133 __slots__ = ()
134
135 @abstractmethod
136 def __await__(self):
137 yield
138
139 @classmethod
140 def __subclasshook__(cls, C):
141 if cls is Awaitable:
142 return _check_methods(C, "__await__")
143 return NotImplemented
144
145 __class_getitem__ = classmethod(GenericAlias)
146
147
148 class ESC[4;38;5;81mCoroutine(ESC[4;38;5;149mAwaitable):
149
150 __slots__ = ()
151
152 @abstractmethod
153 def send(self, value):
154 """Send a value into the coroutine.
155 Return next yielded value or raise StopIteration.
156 """
157 raise StopIteration
158
159 @abstractmethod
160 def throw(self, typ, val=None, tb=None):
161 """Raise an exception in the coroutine.
162 Return next yielded value or raise StopIteration.
163 """
164 if val is None:
165 if tb is None:
166 raise typ
167 val = typ()
168 if tb is not None:
169 val = val.with_traceback(tb)
170 raise val
171
172 def close(self):
173 """Raise GeneratorExit inside coroutine.
174 """
175 try:
176 self.throw(GeneratorExit)
177 except (GeneratorExit, StopIteration):
178 pass
179 else:
180 raise RuntimeError("coroutine ignored GeneratorExit")
181
182 @classmethod
183 def __subclasshook__(cls, C):
184 if cls is Coroutine:
185 return _check_methods(C, '__await__', 'send', 'throw', 'close')
186 return NotImplemented
187
188
189 Coroutine.register(coroutine)
190
191
192 class ESC[4;38;5;81mAsyncIterable(metaclass=ESC[4;38;5;149mABCMeta):
193
194 __slots__ = ()
195
196 @abstractmethod
197 def __aiter__(self):
198 return AsyncIterator()
199
200 @classmethod
201 def __subclasshook__(cls, C):
202 if cls is AsyncIterable:
203 return _check_methods(C, "__aiter__")
204 return NotImplemented
205
206 __class_getitem__ = classmethod(GenericAlias)
207
208
209 class ESC[4;38;5;81mAsyncIterator(ESC[4;38;5;149mAsyncIterable):
210
211 __slots__ = ()
212
213 @abstractmethod
214 async def __anext__(self):
215 """Return the next item or raise StopAsyncIteration when exhausted."""
216 raise StopAsyncIteration
217
218 def __aiter__(self):
219 return self
220
221 @classmethod
222 def __subclasshook__(cls, C):
223 if cls is AsyncIterator:
224 return _check_methods(C, "__anext__", "__aiter__")
225 return NotImplemented
226
227
228 class ESC[4;38;5;81mAsyncGenerator(ESC[4;38;5;149mAsyncIterator):
229
230 __slots__ = ()
231
232 async def __anext__(self):
233 """Return the next item from the asynchronous generator.
234 When exhausted, raise StopAsyncIteration.
235 """
236 return await self.asend(None)
237
238 @abstractmethod
239 async def asend(self, value):
240 """Send a value into the asynchronous generator.
241 Return next yielded value or raise StopAsyncIteration.
242 """
243 raise StopAsyncIteration
244
245 @abstractmethod
246 async def athrow(self, typ, val=None, tb=None):
247 """Raise an exception in the asynchronous generator.
248 Return next yielded value or raise StopAsyncIteration.
249 """
250 if val is None:
251 if tb is None:
252 raise typ
253 val = typ()
254 if tb is not None:
255 val = val.with_traceback(tb)
256 raise val
257
258 async def aclose(self):
259 """Raise GeneratorExit inside coroutine.
260 """
261 try:
262 await self.athrow(GeneratorExit)
263 except (GeneratorExit, StopAsyncIteration):
264 pass
265 else:
266 raise RuntimeError("asynchronous generator ignored GeneratorExit")
267
268 @classmethod
269 def __subclasshook__(cls, C):
270 if cls is AsyncGenerator:
271 return _check_methods(C, '__aiter__', '__anext__',
272 'asend', 'athrow', 'aclose')
273 return NotImplemented
274
275
276 AsyncGenerator.register(async_generator)
277
278
279 class ESC[4;38;5;81mIterable(metaclass=ESC[4;38;5;149mABCMeta):
280
281 __slots__ = ()
282
283 @abstractmethod
284 def __iter__(self):
285 while False:
286 yield None
287
288 @classmethod
289 def __subclasshook__(cls, C):
290 if cls is Iterable:
291 return _check_methods(C, "__iter__")
292 return NotImplemented
293
294 __class_getitem__ = classmethod(GenericAlias)
295
296
297 class ESC[4;38;5;81mIterator(ESC[4;38;5;149mIterable):
298
299 __slots__ = ()
300
301 @abstractmethod
302 def __next__(self):
303 'Return the next item from the iterator. When exhausted, raise StopIteration'
304 raise StopIteration
305
306 def __iter__(self):
307 return self
308
309 @classmethod
310 def __subclasshook__(cls, C):
311 if cls is Iterator:
312 return _check_methods(C, '__iter__', '__next__')
313 return NotImplemented
314
315
316 Iterator.register(bytes_iterator)
317 Iterator.register(bytearray_iterator)
318 #Iterator.register(callable_iterator)
319 Iterator.register(dict_keyiterator)
320 Iterator.register(dict_valueiterator)
321 Iterator.register(dict_itemiterator)
322 Iterator.register(list_iterator)
323 Iterator.register(list_reverseiterator)
324 Iterator.register(range_iterator)
325 Iterator.register(longrange_iterator)
326 Iterator.register(set_iterator)
327 Iterator.register(str_iterator)
328 Iterator.register(tuple_iterator)
329 Iterator.register(zip_iterator)
330
331
332 class ESC[4;38;5;81mReversible(ESC[4;38;5;149mIterable):
333
334 __slots__ = ()
335
336 @abstractmethod
337 def __reversed__(self):
338 while False:
339 yield None
340
341 @classmethod
342 def __subclasshook__(cls, C):
343 if cls is Reversible:
344 return _check_methods(C, "__reversed__", "__iter__")
345 return NotImplemented
346
347
348 class ESC[4;38;5;81mGenerator(ESC[4;38;5;149mIterator):
349
350 __slots__ = ()
351
352 def __next__(self):
353 """Return the next item from the generator.
354 When exhausted, raise StopIteration.
355 """
356 return self.send(None)
357
358 @abstractmethod
359 def send(self, value):
360 """Send a value into the generator.
361 Return next yielded value or raise StopIteration.
362 """
363 raise StopIteration
364
365 @abstractmethod
366 def throw(self, typ, val=None, tb=None):
367 """Raise an exception in the generator.
368 Return next yielded value or raise StopIteration.
369 """
370 if val is None:
371 if tb is None:
372 raise typ
373 val = typ()
374 if tb is not None:
375 val = val.with_traceback(tb)
376 raise val
377
378 def close(self):
379 """Raise GeneratorExit inside generator.
380 """
381 try:
382 self.throw(GeneratorExit)
383 except (GeneratorExit, StopIteration):
384 pass
385 else:
386 raise RuntimeError("generator ignored GeneratorExit")
387
388 @classmethod
389 def __subclasshook__(cls, C):
390 if cls is Generator:
391 return _check_methods(C, '__iter__', '__next__',
392 'send', 'throw', 'close')
393 return NotImplemented
394
395
396 Generator.register(generator)
397
398
399 class ESC[4;38;5;81mSized(metaclass=ESC[4;38;5;149mABCMeta):
400
401 __slots__ = ()
402
403 @abstractmethod
404 def __len__(self):
405 return 0
406
407 @classmethod
408 def __subclasshook__(cls, C):
409 if cls is Sized:
410 return _check_methods(C, "__len__")
411 return NotImplemented
412
413
414 class ESC[4;38;5;81mContainer(metaclass=ESC[4;38;5;149mABCMeta):
415
416 __slots__ = ()
417
418 @abstractmethod
419 def __contains__(self, x):
420 return False
421
422 @classmethod
423 def __subclasshook__(cls, C):
424 if cls is Container:
425 return _check_methods(C, "__contains__")
426 return NotImplemented
427
428 __class_getitem__ = classmethod(GenericAlias)
429
430
431 class ESC[4;38;5;81mCollection(ESC[4;38;5;149mSized, ESC[4;38;5;149mIterable, ESC[4;38;5;149mContainer):
432
433 __slots__ = ()
434
435 @classmethod
436 def __subclasshook__(cls, C):
437 if cls is Collection:
438 return _check_methods(C, "__len__", "__iter__", "__contains__")
439 return NotImplemented
440
441
442 class ESC[4;38;5;81mBuffer(metaclass=ESC[4;38;5;149mABCMeta):
443
444 __slots__ = ()
445
446 @abstractmethod
447 def __buffer__(self, flags: int, /) -> memoryview:
448 raise NotImplementedError
449
450 @classmethod
451 def __subclasshook__(cls, C):
452 if cls is Buffer:
453 return _check_methods(C, "__buffer__")
454 return NotImplemented
455
456
457 class ESC[4;38;5;81m_CallableGenericAlias(ESC[4;38;5;149mGenericAlias):
458 """ Represent `Callable[argtypes, resulttype]`.
459
460 This sets ``__args__`` to a tuple containing the flattened ``argtypes``
461 followed by ``resulttype``.
462
463 Example: ``Callable[[int, str], float]`` sets ``__args__`` to
464 ``(int, str, float)``.
465 """
466
467 __slots__ = ()
468
469 def __new__(cls, origin, args):
470 if not (isinstance(args, tuple) and len(args) == 2):
471 raise TypeError(
472 "Callable must be used as Callable[[arg, ...], result].")
473 t_args, t_result = args
474 if isinstance(t_args, (tuple, list)):
475 args = (*t_args, t_result)
476 elif not _is_param_expr(t_args):
477 raise TypeError(f"Expected a list of types, an ellipsis, "
478 f"ParamSpec, or Concatenate. Got {t_args}")
479 return super().__new__(cls, origin, args)
480
481 def __repr__(self):
482 if len(self.__args__) == 2 and _is_param_expr(self.__args__[0]):
483 return super().__repr__()
484 return (f'collections.abc.Callable'
485 f'[[{", ".join([_type_repr(a) for a in self.__args__[:-1]])}], '
486 f'{_type_repr(self.__args__[-1])}]')
487
488 def __reduce__(self):
489 args = self.__args__
490 if not (len(args) == 2 and _is_param_expr(args[0])):
491 args = list(args[:-1]), args[-1]
492 return _CallableGenericAlias, (Callable, args)
493
494 def __getitem__(self, item):
495 # Called during TypeVar substitution, returns the custom subclass
496 # rather than the default types.GenericAlias object. Most of the
497 # code is copied from typing's _GenericAlias and the builtin
498 # types.GenericAlias.
499 if not isinstance(item, tuple):
500 item = (item,)
501
502 new_args = super().__getitem__(item).__args__
503
504 # args[0] occurs due to things like Z[[int, str, bool]] from PEP 612
505 if not isinstance(new_args[0], (tuple, list)):
506 t_result = new_args[-1]
507 t_args = new_args[:-1]
508 new_args = (t_args, t_result)
509 return _CallableGenericAlias(Callable, tuple(new_args))
510
511 def _is_param_expr(obj):
512 """Checks if obj matches either a list of types, ``...``, ``ParamSpec`` or
513 ``_ConcatenateGenericAlias`` from typing.py
514 """
515 if obj is Ellipsis:
516 return True
517 if isinstance(obj, list):
518 return True
519 obj = type(obj)
520 names = ('ParamSpec', '_ConcatenateGenericAlias')
521 return obj.__module__ == 'typing' and any(obj.__name__ == name for name in names)
522
523 def _type_repr(obj):
524 """Return the repr() of an object, special-casing types (internal helper).
525
526 Copied from :mod:`typing` since collections.abc
527 shouldn't depend on that module.
528 (Keep this roughly in sync with the typing version.)
529 """
530 if isinstance(obj, type):
531 if obj.__module__ == 'builtins':
532 return obj.__qualname__
533 return f'{obj.__module__}.{obj.__qualname__}'
534 if obj is Ellipsis:
535 return '...'
536 if isinstance(obj, FunctionType):
537 return obj.__name__
538 return repr(obj)
539
540
541 class ESC[4;38;5;81mCallable(metaclass=ESC[4;38;5;149mABCMeta):
542
543 __slots__ = ()
544
545 @abstractmethod
546 def __call__(self, *args, **kwds):
547 return False
548
549 @classmethod
550 def __subclasshook__(cls, C):
551 if cls is Callable:
552 return _check_methods(C, "__call__")
553 return NotImplemented
554
555 __class_getitem__ = classmethod(_CallableGenericAlias)
556
557
558 ### SETS ###
559
560
561 class ESC[4;38;5;81mSet(ESC[4;38;5;149mCollection):
562 """A set is a finite, iterable container.
563
564 This class provides concrete generic implementations of all
565 methods except for __contains__, __iter__ and __len__.
566
567 To override the comparisons (presumably for speed, as the
568 semantics are fixed), redefine __le__ and __ge__,
569 then the other operations will automatically follow suit.
570 """
571
572 __slots__ = ()
573
574 def __le__(self, other):
575 if not isinstance(other, Set):
576 return NotImplemented
577 if len(self) > len(other):
578 return False
579 for elem in self:
580 if elem not in other:
581 return False
582 return True
583
584 def __lt__(self, other):
585 if not isinstance(other, Set):
586 return NotImplemented
587 return len(self) < len(other) and self.__le__(other)
588
589 def __gt__(self, other):
590 if not isinstance(other, Set):
591 return NotImplemented
592 return len(self) > len(other) and self.__ge__(other)
593
594 def __ge__(self, other):
595 if not isinstance(other, Set):
596 return NotImplemented
597 if len(self) < len(other):
598 return False
599 for elem in other:
600 if elem not in self:
601 return False
602 return True
603
604 def __eq__(self, other):
605 if not isinstance(other, Set):
606 return NotImplemented
607 return len(self) == len(other) and self.__le__(other)
608
609 @classmethod
610 def _from_iterable(cls, it):
611 '''Construct an instance of the class from any iterable input.
612
613 Must override this method if the class constructor signature
614 does not accept an iterable for an input.
615 '''
616 return cls(it)
617
618 def __and__(self, other):
619 if not isinstance(other, Iterable):
620 return NotImplemented
621 return self._from_iterable(value for value in other if value in self)
622
623 __rand__ = __and__
624
625 def isdisjoint(self, other):
626 'Return True if two sets have a null intersection.'
627 for value in other:
628 if value in self:
629 return False
630 return True
631
632 def __or__(self, other):
633 if not isinstance(other, Iterable):
634 return NotImplemented
635 chain = (e for s in (self, other) for e in s)
636 return self._from_iterable(chain)
637
638 __ror__ = __or__
639
640 def __sub__(self, other):
641 if not isinstance(other, Set):
642 if not isinstance(other, Iterable):
643 return NotImplemented
644 other = self._from_iterable(other)
645 return self._from_iterable(value for value in self
646 if value not in other)
647
648 def __rsub__(self, other):
649 if not isinstance(other, Set):
650 if not isinstance(other, Iterable):
651 return NotImplemented
652 other = self._from_iterable(other)
653 return self._from_iterable(value for value in other
654 if value not in self)
655
656 def __xor__(self, other):
657 if not isinstance(other, Set):
658 if not isinstance(other, Iterable):
659 return NotImplemented
660 other = self._from_iterable(other)
661 return (self - other) | (other - self)
662
663 __rxor__ = __xor__
664
665 def _hash(self):
666 """Compute the hash value of a set.
667
668 Note that we don't define __hash__: not all sets are hashable.
669 But if you define a hashable set type, its __hash__ should
670 call this function.
671
672 This must be compatible __eq__.
673
674 All sets ought to compare equal if they contain the same
675 elements, regardless of how they are implemented, and
676 regardless of the order of the elements; so there's not much
677 freedom for __eq__ or __hash__. We match the algorithm used
678 by the built-in frozenset type.
679 """
680 MAX = sys.maxsize
681 MASK = 2 * MAX + 1
682 n = len(self)
683 h = 1927868237 * (n + 1)
684 h &= MASK
685 for x in self:
686 hx = hash(x)
687 h ^= (hx ^ (hx << 16) ^ 89869747) * 3644798167
688 h &= MASK
689 h ^= (h >> 11) ^ (h >> 25)
690 h = h * 69069 + 907133923
691 h &= MASK
692 if h > MAX:
693 h -= MASK + 1
694 if h == -1:
695 h = 590923713
696 return h
697
698
699 Set.register(frozenset)
700
701
702 class ESC[4;38;5;81mMutableSet(ESC[4;38;5;149mSet):
703 """A mutable set is a finite, iterable container.
704
705 This class provides concrete generic implementations of all
706 methods except for __contains__, __iter__, __len__,
707 add(), and discard().
708
709 To override the comparisons (presumably for speed, as the
710 semantics are fixed), all you have to do is redefine __le__ and
711 then the other operations will automatically follow suit.
712 """
713
714 __slots__ = ()
715
716 @abstractmethod
717 def add(self, value):
718 """Add an element."""
719 raise NotImplementedError
720
721 @abstractmethod
722 def discard(self, value):
723 """Remove an element. Do not raise an exception if absent."""
724 raise NotImplementedError
725
726 def remove(self, value):
727 """Remove an element. If not a member, raise a KeyError."""
728 if value not in self:
729 raise KeyError(value)
730 self.discard(value)
731
732 def pop(self):
733 """Return the popped value. Raise KeyError if empty."""
734 it = iter(self)
735 try:
736 value = next(it)
737 except StopIteration:
738 raise KeyError from None
739 self.discard(value)
740 return value
741
742 def clear(self):
743 """This is slow (creates N new iterators!) but effective."""
744 try:
745 while True:
746 self.pop()
747 except KeyError:
748 pass
749
750 def __ior__(self, it):
751 for value in it:
752 self.add(value)
753 return self
754
755 def __iand__(self, it):
756 for value in (self - it):
757 self.discard(value)
758 return self
759
760 def __ixor__(self, it):
761 if it is self:
762 self.clear()
763 else:
764 if not isinstance(it, Set):
765 it = self._from_iterable(it)
766 for value in it:
767 if value in self:
768 self.discard(value)
769 else:
770 self.add(value)
771 return self
772
773 def __isub__(self, it):
774 if it is self:
775 self.clear()
776 else:
777 for value in it:
778 self.discard(value)
779 return self
780
781
782 MutableSet.register(set)
783
784
785 ### MAPPINGS ###
786
787 class ESC[4;38;5;81mMapping(ESC[4;38;5;149mCollection):
788 """A Mapping is a generic container for associating key/value
789 pairs.
790
791 This class provides concrete generic implementations of all
792 methods except for __getitem__, __iter__, and __len__.
793 """
794
795 __slots__ = ()
796
797 # Tell ABCMeta.__new__ that this class should have TPFLAGS_MAPPING set.
798 __abc_tpflags__ = 1 << 6 # Py_TPFLAGS_MAPPING
799
800 @abstractmethod
801 def __getitem__(self, key):
802 raise KeyError
803
804 def get(self, key, default=None):
805 'D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.'
806 try:
807 return self[key]
808 except KeyError:
809 return default
810
811 def __contains__(self, key):
812 try:
813 self[key]
814 except KeyError:
815 return False
816 else:
817 return True
818
819 def keys(self):
820 "D.keys() -> a set-like object providing a view on D's keys"
821 return KeysView(self)
822
823 def items(self):
824 "D.items() -> a set-like object providing a view on D's items"
825 return ItemsView(self)
826
827 def values(self):
828 "D.values() -> an object providing a view on D's values"
829 return ValuesView(self)
830
831 def __eq__(self, other):
832 if not isinstance(other, Mapping):
833 return NotImplemented
834 return dict(self.items()) == dict(other.items())
835
836 __reversed__ = None
837
838 Mapping.register(mappingproxy)
839
840
841 class ESC[4;38;5;81mMappingView(ESC[4;38;5;149mSized):
842
843 __slots__ = '_mapping',
844
845 def __init__(self, mapping):
846 self._mapping = mapping
847
848 def __len__(self):
849 return len(self._mapping)
850
851 def __repr__(self):
852 return '{0.__class__.__name__}({0._mapping!r})'.format(self)
853
854 __class_getitem__ = classmethod(GenericAlias)
855
856
857 class ESC[4;38;5;81mKeysView(ESC[4;38;5;149mMappingView, ESC[4;38;5;149mSet):
858
859 __slots__ = ()
860
861 @classmethod
862 def _from_iterable(cls, it):
863 return set(it)
864
865 def __contains__(self, key):
866 return key in self._mapping
867
868 def __iter__(self):
869 yield from self._mapping
870
871
872 KeysView.register(dict_keys)
873
874
875 class ESC[4;38;5;81mItemsView(ESC[4;38;5;149mMappingView, ESC[4;38;5;149mSet):
876
877 __slots__ = ()
878
879 @classmethod
880 def _from_iterable(cls, it):
881 return set(it)
882
883 def __contains__(self, item):
884 key, value = item
885 try:
886 v = self._mapping[key]
887 except KeyError:
888 return False
889 else:
890 return v is value or v == value
891
892 def __iter__(self):
893 for key in self._mapping:
894 yield (key, self._mapping[key])
895
896
897 ItemsView.register(dict_items)
898
899
900 class ESC[4;38;5;81mValuesView(ESC[4;38;5;149mMappingView, ESC[4;38;5;149mCollection):
901
902 __slots__ = ()
903
904 def __contains__(self, value):
905 for key in self._mapping:
906 v = self._mapping[key]
907 if v is value or v == value:
908 return True
909 return False
910
911 def __iter__(self):
912 for key in self._mapping:
913 yield self._mapping[key]
914
915
916 ValuesView.register(dict_values)
917
918
919 class ESC[4;38;5;81mMutableMapping(ESC[4;38;5;149mMapping):
920 """A MutableMapping is a generic container for associating
921 key/value pairs.
922
923 This class provides concrete generic implementations of all
924 methods except for __getitem__, __setitem__, __delitem__,
925 __iter__, and __len__.
926 """
927
928 __slots__ = ()
929
930 @abstractmethod
931 def __setitem__(self, key, value):
932 raise KeyError
933
934 @abstractmethod
935 def __delitem__(self, key):
936 raise KeyError
937
938 __marker = object()
939
940 def pop(self, key, default=__marker):
941 '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
942 If key is not found, d is returned if given, otherwise KeyError is raised.
943 '''
944 try:
945 value = self[key]
946 except KeyError:
947 if default is self.__marker:
948 raise
949 return default
950 else:
951 del self[key]
952 return value
953
954 def popitem(self):
955 '''D.popitem() -> (k, v), remove and return some (key, value) pair
956 as a 2-tuple; but raise KeyError if D is empty.
957 '''
958 try:
959 key = next(iter(self))
960 except StopIteration:
961 raise KeyError from None
962 value = self[key]
963 del self[key]
964 return key, value
965
966 def clear(self):
967 'D.clear() -> None. Remove all items from D.'
968 try:
969 while True:
970 self.popitem()
971 except KeyError:
972 pass
973
974 def update(self, other=(), /, **kwds):
975 ''' D.update([E, ]**F) -> None. Update D from mapping/iterable E and F.
976 If E present and has a .keys() method, does: for k in E: D[k] = E[k]
977 If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v
978 In either case, this is followed by: for k, v in F.items(): D[k] = v
979 '''
980 if isinstance(other, Mapping):
981 for key in other:
982 self[key] = other[key]
983 elif hasattr(other, "keys"):
984 for key in other.keys():
985 self[key] = other[key]
986 else:
987 for key, value in other:
988 self[key] = value
989 for key, value in kwds.items():
990 self[key] = value
991
992 def setdefault(self, key, default=None):
993 'D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D'
994 try:
995 return self[key]
996 except KeyError:
997 self[key] = default
998 return default
999
1000
1001 MutableMapping.register(dict)
1002
1003
1004 ### SEQUENCES ###
1005
1006 class ESC[4;38;5;81mSequence(ESC[4;38;5;149mReversible, ESC[4;38;5;149mCollection):
1007 """All the operations on a read-only sequence.
1008
1009 Concrete subclasses must override __new__ or __init__,
1010 __getitem__, and __len__.
1011 """
1012
1013 __slots__ = ()
1014
1015 # Tell ABCMeta.__new__ that this class should have TPFLAGS_SEQUENCE set.
1016 __abc_tpflags__ = 1 << 5 # Py_TPFLAGS_SEQUENCE
1017
1018 @abstractmethod
1019 def __getitem__(self, index):
1020 raise IndexError
1021
1022 def __iter__(self):
1023 i = 0
1024 try:
1025 while True:
1026 v = self[i]
1027 yield v
1028 i += 1
1029 except IndexError:
1030 return
1031
1032 def __contains__(self, value):
1033 for v in self:
1034 if v is value or v == value:
1035 return True
1036 return False
1037
1038 def __reversed__(self):
1039 for i in reversed(range(len(self))):
1040 yield self[i]
1041
1042 def index(self, value, start=0, stop=None):
1043 '''S.index(value, [start, [stop]]) -> integer -- return first index of value.
1044 Raises ValueError if the value is not present.
1045
1046 Supporting start and stop arguments is optional, but
1047 recommended.
1048 '''
1049 if start is not None and start < 0:
1050 start = max(len(self) + start, 0)
1051 if stop is not None and stop < 0:
1052 stop += len(self)
1053
1054 i = start
1055 while stop is None or i < stop:
1056 try:
1057 v = self[i]
1058 except IndexError:
1059 break
1060 if v is value or v == value:
1061 return i
1062 i += 1
1063 raise ValueError
1064
1065 def count(self, value):
1066 'S.count(value) -> integer -- return number of occurrences of value'
1067 return sum(1 for v in self if v is value or v == value)
1068
1069 Sequence.register(tuple)
1070 Sequence.register(str)
1071 Sequence.register(range)
1072 Sequence.register(memoryview)
1073
1074 class ESC[4;38;5;81m_DeprecateByteStringMeta(ESC[4;38;5;149mABCMeta):
1075 def __new__(cls, name, bases, namespace, **kwargs):
1076 if name != "ByteString":
1077 import warnings
1078
1079 warnings._deprecated(
1080 "collections.abc.ByteString",
1081 remove=(3, 14),
1082 )
1083 return super().__new__(cls, name, bases, namespace, **kwargs)
1084
1085 def __instancecheck__(cls, instance):
1086 import warnings
1087
1088 warnings._deprecated(
1089 "collections.abc.ByteString",
1090 remove=(3, 14),
1091 )
1092 return super().__instancecheck__(instance)
1093
1094 class ESC[4;38;5;81mByteString(ESC[4;38;5;149mSequence, metaclass=ESC[4;38;5;149m_DeprecateByteStringMeta):
1095 """This unifies bytes and bytearray.
1096
1097 XXX Should add all their methods.
1098 """
1099
1100 __slots__ = ()
1101
1102 ByteString.register(bytes)
1103 ByteString.register(bytearray)
1104
1105
1106 class ESC[4;38;5;81mMutableSequence(ESC[4;38;5;149mSequence):
1107 """All the operations on a read-write sequence.
1108
1109 Concrete subclasses must provide __new__ or __init__,
1110 __getitem__, __setitem__, __delitem__, __len__, and insert().
1111 """
1112
1113 __slots__ = ()
1114
1115 @abstractmethod
1116 def __setitem__(self, index, value):
1117 raise IndexError
1118
1119 @abstractmethod
1120 def __delitem__(self, index):
1121 raise IndexError
1122
1123 @abstractmethod
1124 def insert(self, index, value):
1125 'S.insert(index, value) -- insert value before index'
1126 raise IndexError
1127
1128 def append(self, value):
1129 'S.append(value) -- append value to the end of the sequence'
1130 self.insert(len(self), value)
1131
1132 def clear(self):
1133 'S.clear() -> None -- remove all items from S'
1134 try:
1135 while True:
1136 self.pop()
1137 except IndexError:
1138 pass
1139
1140 def reverse(self):
1141 'S.reverse() -- reverse *IN PLACE*'
1142 n = len(self)
1143 for i in range(n//2):
1144 self[i], self[n-i-1] = self[n-i-1], self[i]
1145
1146 def extend(self, values):
1147 'S.extend(iterable) -- extend sequence by appending elements from the iterable'
1148 if values is self:
1149 values = list(values)
1150 for v in values:
1151 self.append(v)
1152
1153 def pop(self, index=-1):
1154 '''S.pop([index]) -> item -- remove and return item at index (default last).
1155 Raise IndexError if list is empty or index is out of range.
1156 '''
1157 v = self[index]
1158 del self[index]
1159 return v
1160
1161 def remove(self, value):
1162 '''S.remove(value) -- remove first occurrence of value.
1163 Raise ValueError if the value is not present.
1164 '''
1165 del self[self.index(value)]
1166
1167 def __iadd__(self, values):
1168 self.extend(values)
1169 return self
1170
1171
1172 MutableSequence.register(list)
1173 MutableSequence.register(bytearray) # Multiply inheriting, see ByteString