17db96d56Sopenharmony_ci# Copyright 2007 Google, Inc. All Rights Reserved. 27db96d56Sopenharmony_ci# Licensed to PSF under a Contributor Agreement. 37db96d56Sopenharmony_ci 47db96d56Sopenharmony_ci"""Abstract Base Classes (ABCs) for collections, according to PEP 3119. 57db96d56Sopenharmony_ci 67db96d56Sopenharmony_ciUnit tests are in test_collections. 77db96d56Sopenharmony_ci""" 87db96d56Sopenharmony_ci 97db96d56Sopenharmony_cifrom abc import ABCMeta, abstractmethod 107db96d56Sopenharmony_ciimport sys 117db96d56Sopenharmony_ci 127db96d56Sopenharmony_ciGenericAlias = type(list[int]) 137db96d56Sopenharmony_ciEllipsisType = type(...) 147db96d56Sopenharmony_cidef _f(): pass 157db96d56Sopenharmony_ciFunctionType = type(_f) 167db96d56Sopenharmony_cidel _f 177db96d56Sopenharmony_ci 187db96d56Sopenharmony_ci__all__ = ["Awaitable", "Coroutine", 197db96d56Sopenharmony_ci "AsyncIterable", "AsyncIterator", "AsyncGenerator", 207db96d56Sopenharmony_ci "Hashable", "Iterable", "Iterator", "Generator", "Reversible", 217db96d56Sopenharmony_ci "Sized", "Container", "Callable", "Collection", 227db96d56Sopenharmony_ci "Set", "MutableSet", 237db96d56Sopenharmony_ci "Mapping", "MutableMapping", 247db96d56Sopenharmony_ci "MappingView", "KeysView", "ItemsView", "ValuesView", 257db96d56Sopenharmony_ci "Sequence", "MutableSequence", 267db96d56Sopenharmony_ci "ByteString", 277db96d56Sopenharmony_ci ] 287db96d56Sopenharmony_ci 297db96d56Sopenharmony_ci# This module has been renamed from collections.abc to _collections_abc to 307db96d56Sopenharmony_ci# speed up interpreter startup. Some of the types such as MutableMapping are 317db96d56Sopenharmony_ci# required early but collections module imports a lot of other modules. 327db96d56Sopenharmony_ci# See issue #19218 337db96d56Sopenharmony_ci__name__ = "collections.abc" 347db96d56Sopenharmony_ci 357db96d56Sopenharmony_ci# Private list of types that we want to register with the various ABCs 367db96d56Sopenharmony_ci# so that they will pass tests like: 377db96d56Sopenharmony_ci# it = iter(somebytearray) 387db96d56Sopenharmony_ci# assert isinstance(it, Iterable) 397db96d56Sopenharmony_ci# Note: in other implementations, these types might not be distinct 407db96d56Sopenharmony_ci# and they may have their own implementation specific types that 417db96d56Sopenharmony_ci# are not included on this list. 427db96d56Sopenharmony_cibytes_iterator = type(iter(b'')) 437db96d56Sopenharmony_cibytearray_iterator = type(iter(bytearray())) 447db96d56Sopenharmony_ci#callable_iterator = ??? 457db96d56Sopenharmony_cidict_keyiterator = type(iter({}.keys())) 467db96d56Sopenharmony_cidict_valueiterator = type(iter({}.values())) 477db96d56Sopenharmony_cidict_itemiterator = type(iter({}.items())) 487db96d56Sopenharmony_cilist_iterator = type(iter([])) 497db96d56Sopenharmony_cilist_reverseiterator = type(iter(reversed([]))) 507db96d56Sopenharmony_cirange_iterator = type(iter(range(0))) 517db96d56Sopenharmony_cilongrange_iterator = type(iter(range(1 << 1000))) 527db96d56Sopenharmony_ciset_iterator = type(iter(set())) 537db96d56Sopenharmony_cistr_iterator = type(iter("")) 547db96d56Sopenharmony_cituple_iterator = type(iter(())) 557db96d56Sopenharmony_cizip_iterator = type(iter(zip())) 567db96d56Sopenharmony_ci## views ## 577db96d56Sopenharmony_cidict_keys = type({}.keys()) 587db96d56Sopenharmony_cidict_values = type({}.values()) 597db96d56Sopenharmony_cidict_items = type({}.items()) 607db96d56Sopenharmony_ci## misc ## 617db96d56Sopenharmony_cimappingproxy = type(type.__dict__) 627db96d56Sopenharmony_cigenerator = type((lambda: (yield))()) 637db96d56Sopenharmony_ci## coroutine ## 647db96d56Sopenharmony_ciasync def _coro(): pass 657db96d56Sopenharmony_ci_coro = _coro() 667db96d56Sopenharmony_cicoroutine = type(_coro) 677db96d56Sopenharmony_ci_coro.close() # Prevent ResourceWarning 687db96d56Sopenharmony_cidel _coro 697db96d56Sopenharmony_ci## asynchronous generator ## 707db96d56Sopenharmony_ciasync def _ag(): yield 717db96d56Sopenharmony_ci_ag = _ag() 727db96d56Sopenharmony_ciasync_generator = type(_ag) 737db96d56Sopenharmony_cidel _ag 747db96d56Sopenharmony_ci 757db96d56Sopenharmony_ci 767db96d56Sopenharmony_ci### ONE-TRICK PONIES ### 777db96d56Sopenharmony_ci 787db96d56Sopenharmony_cidef _check_methods(C, *methods): 797db96d56Sopenharmony_ci mro = C.__mro__ 807db96d56Sopenharmony_ci for method in methods: 817db96d56Sopenharmony_ci for B in mro: 827db96d56Sopenharmony_ci if method in B.__dict__: 837db96d56Sopenharmony_ci if B.__dict__[method] is None: 847db96d56Sopenharmony_ci return NotImplemented 857db96d56Sopenharmony_ci break 867db96d56Sopenharmony_ci else: 877db96d56Sopenharmony_ci return NotImplemented 887db96d56Sopenharmony_ci return True 897db96d56Sopenharmony_ci 907db96d56Sopenharmony_ciclass Hashable(metaclass=ABCMeta): 917db96d56Sopenharmony_ci 927db96d56Sopenharmony_ci __slots__ = () 937db96d56Sopenharmony_ci 947db96d56Sopenharmony_ci @abstractmethod 957db96d56Sopenharmony_ci def __hash__(self): 967db96d56Sopenharmony_ci return 0 977db96d56Sopenharmony_ci 987db96d56Sopenharmony_ci @classmethod 997db96d56Sopenharmony_ci def __subclasshook__(cls, C): 1007db96d56Sopenharmony_ci if cls is Hashable: 1017db96d56Sopenharmony_ci return _check_methods(C, "__hash__") 1027db96d56Sopenharmony_ci return NotImplemented 1037db96d56Sopenharmony_ci 1047db96d56Sopenharmony_ci 1057db96d56Sopenharmony_ciclass Awaitable(metaclass=ABCMeta): 1067db96d56Sopenharmony_ci 1077db96d56Sopenharmony_ci __slots__ = () 1087db96d56Sopenharmony_ci 1097db96d56Sopenharmony_ci @abstractmethod 1107db96d56Sopenharmony_ci def __await__(self): 1117db96d56Sopenharmony_ci yield 1127db96d56Sopenharmony_ci 1137db96d56Sopenharmony_ci @classmethod 1147db96d56Sopenharmony_ci def __subclasshook__(cls, C): 1157db96d56Sopenharmony_ci if cls is Awaitable: 1167db96d56Sopenharmony_ci return _check_methods(C, "__await__") 1177db96d56Sopenharmony_ci return NotImplemented 1187db96d56Sopenharmony_ci 1197db96d56Sopenharmony_ci __class_getitem__ = classmethod(GenericAlias) 1207db96d56Sopenharmony_ci 1217db96d56Sopenharmony_ci 1227db96d56Sopenharmony_ciclass Coroutine(Awaitable): 1237db96d56Sopenharmony_ci 1247db96d56Sopenharmony_ci __slots__ = () 1257db96d56Sopenharmony_ci 1267db96d56Sopenharmony_ci @abstractmethod 1277db96d56Sopenharmony_ci def send(self, value): 1287db96d56Sopenharmony_ci """Send a value into the coroutine. 1297db96d56Sopenharmony_ci Return next yielded value or raise StopIteration. 1307db96d56Sopenharmony_ci """ 1317db96d56Sopenharmony_ci raise StopIteration 1327db96d56Sopenharmony_ci 1337db96d56Sopenharmony_ci @abstractmethod 1347db96d56Sopenharmony_ci def throw(self, typ, val=None, tb=None): 1357db96d56Sopenharmony_ci """Raise an exception in the coroutine. 1367db96d56Sopenharmony_ci Return next yielded value or raise StopIteration. 1377db96d56Sopenharmony_ci """ 1387db96d56Sopenharmony_ci if val is None: 1397db96d56Sopenharmony_ci if tb is None: 1407db96d56Sopenharmony_ci raise typ 1417db96d56Sopenharmony_ci val = typ() 1427db96d56Sopenharmony_ci if tb is not None: 1437db96d56Sopenharmony_ci val = val.with_traceback(tb) 1447db96d56Sopenharmony_ci raise val 1457db96d56Sopenharmony_ci 1467db96d56Sopenharmony_ci def close(self): 1477db96d56Sopenharmony_ci """Raise GeneratorExit inside coroutine. 1487db96d56Sopenharmony_ci """ 1497db96d56Sopenharmony_ci try: 1507db96d56Sopenharmony_ci self.throw(GeneratorExit) 1517db96d56Sopenharmony_ci except (GeneratorExit, StopIteration): 1527db96d56Sopenharmony_ci pass 1537db96d56Sopenharmony_ci else: 1547db96d56Sopenharmony_ci raise RuntimeError("coroutine ignored GeneratorExit") 1557db96d56Sopenharmony_ci 1567db96d56Sopenharmony_ci @classmethod 1577db96d56Sopenharmony_ci def __subclasshook__(cls, C): 1587db96d56Sopenharmony_ci if cls is Coroutine: 1597db96d56Sopenharmony_ci return _check_methods(C, '__await__', 'send', 'throw', 'close') 1607db96d56Sopenharmony_ci return NotImplemented 1617db96d56Sopenharmony_ci 1627db96d56Sopenharmony_ci 1637db96d56Sopenharmony_ciCoroutine.register(coroutine) 1647db96d56Sopenharmony_ci 1657db96d56Sopenharmony_ci 1667db96d56Sopenharmony_ciclass AsyncIterable(metaclass=ABCMeta): 1677db96d56Sopenharmony_ci 1687db96d56Sopenharmony_ci __slots__ = () 1697db96d56Sopenharmony_ci 1707db96d56Sopenharmony_ci @abstractmethod 1717db96d56Sopenharmony_ci def __aiter__(self): 1727db96d56Sopenharmony_ci return AsyncIterator() 1737db96d56Sopenharmony_ci 1747db96d56Sopenharmony_ci @classmethod 1757db96d56Sopenharmony_ci def __subclasshook__(cls, C): 1767db96d56Sopenharmony_ci if cls is AsyncIterable: 1777db96d56Sopenharmony_ci return _check_methods(C, "__aiter__") 1787db96d56Sopenharmony_ci return NotImplemented 1797db96d56Sopenharmony_ci 1807db96d56Sopenharmony_ci __class_getitem__ = classmethod(GenericAlias) 1817db96d56Sopenharmony_ci 1827db96d56Sopenharmony_ci 1837db96d56Sopenharmony_ciclass AsyncIterator(AsyncIterable): 1847db96d56Sopenharmony_ci 1857db96d56Sopenharmony_ci __slots__ = () 1867db96d56Sopenharmony_ci 1877db96d56Sopenharmony_ci @abstractmethod 1887db96d56Sopenharmony_ci async def __anext__(self): 1897db96d56Sopenharmony_ci """Return the next item or raise StopAsyncIteration when exhausted.""" 1907db96d56Sopenharmony_ci raise StopAsyncIteration 1917db96d56Sopenharmony_ci 1927db96d56Sopenharmony_ci def __aiter__(self): 1937db96d56Sopenharmony_ci return self 1947db96d56Sopenharmony_ci 1957db96d56Sopenharmony_ci @classmethod 1967db96d56Sopenharmony_ci def __subclasshook__(cls, C): 1977db96d56Sopenharmony_ci if cls is AsyncIterator: 1987db96d56Sopenharmony_ci return _check_methods(C, "__anext__", "__aiter__") 1997db96d56Sopenharmony_ci return NotImplemented 2007db96d56Sopenharmony_ci 2017db96d56Sopenharmony_ci 2027db96d56Sopenharmony_ciclass AsyncGenerator(AsyncIterator): 2037db96d56Sopenharmony_ci 2047db96d56Sopenharmony_ci __slots__ = () 2057db96d56Sopenharmony_ci 2067db96d56Sopenharmony_ci async def __anext__(self): 2077db96d56Sopenharmony_ci """Return the next item from the asynchronous generator. 2087db96d56Sopenharmony_ci When exhausted, raise StopAsyncIteration. 2097db96d56Sopenharmony_ci """ 2107db96d56Sopenharmony_ci return await self.asend(None) 2117db96d56Sopenharmony_ci 2127db96d56Sopenharmony_ci @abstractmethod 2137db96d56Sopenharmony_ci async def asend(self, value): 2147db96d56Sopenharmony_ci """Send a value into the asynchronous generator. 2157db96d56Sopenharmony_ci Return next yielded value or raise StopAsyncIteration. 2167db96d56Sopenharmony_ci """ 2177db96d56Sopenharmony_ci raise StopAsyncIteration 2187db96d56Sopenharmony_ci 2197db96d56Sopenharmony_ci @abstractmethod 2207db96d56Sopenharmony_ci async def athrow(self, typ, val=None, tb=None): 2217db96d56Sopenharmony_ci """Raise an exception in the asynchronous generator. 2227db96d56Sopenharmony_ci Return next yielded value or raise StopAsyncIteration. 2237db96d56Sopenharmony_ci """ 2247db96d56Sopenharmony_ci if val is None: 2257db96d56Sopenharmony_ci if tb is None: 2267db96d56Sopenharmony_ci raise typ 2277db96d56Sopenharmony_ci val = typ() 2287db96d56Sopenharmony_ci if tb is not None: 2297db96d56Sopenharmony_ci val = val.with_traceback(tb) 2307db96d56Sopenharmony_ci raise val 2317db96d56Sopenharmony_ci 2327db96d56Sopenharmony_ci async def aclose(self): 2337db96d56Sopenharmony_ci """Raise GeneratorExit inside coroutine. 2347db96d56Sopenharmony_ci """ 2357db96d56Sopenharmony_ci try: 2367db96d56Sopenharmony_ci await self.athrow(GeneratorExit) 2377db96d56Sopenharmony_ci except (GeneratorExit, StopAsyncIteration): 2387db96d56Sopenharmony_ci pass 2397db96d56Sopenharmony_ci else: 2407db96d56Sopenharmony_ci raise RuntimeError("asynchronous generator ignored GeneratorExit") 2417db96d56Sopenharmony_ci 2427db96d56Sopenharmony_ci @classmethod 2437db96d56Sopenharmony_ci def __subclasshook__(cls, C): 2447db96d56Sopenharmony_ci if cls is AsyncGenerator: 2457db96d56Sopenharmony_ci return _check_methods(C, '__aiter__', '__anext__', 2467db96d56Sopenharmony_ci 'asend', 'athrow', 'aclose') 2477db96d56Sopenharmony_ci return NotImplemented 2487db96d56Sopenharmony_ci 2497db96d56Sopenharmony_ci 2507db96d56Sopenharmony_ciAsyncGenerator.register(async_generator) 2517db96d56Sopenharmony_ci 2527db96d56Sopenharmony_ci 2537db96d56Sopenharmony_ciclass Iterable(metaclass=ABCMeta): 2547db96d56Sopenharmony_ci 2557db96d56Sopenharmony_ci __slots__ = () 2567db96d56Sopenharmony_ci 2577db96d56Sopenharmony_ci @abstractmethod 2587db96d56Sopenharmony_ci def __iter__(self): 2597db96d56Sopenharmony_ci while False: 2607db96d56Sopenharmony_ci yield None 2617db96d56Sopenharmony_ci 2627db96d56Sopenharmony_ci @classmethod 2637db96d56Sopenharmony_ci def __subclasshook__(cls, C): 2647db96d56Sopenharmony_ci if cls is Iterable: 2657db96d56Sopenharmony_ci return _check_methods(C, "__iter__") 2667db96d56Sopenharmony_ci return NotImplemented 2677db96d56Sopenharmony_ci 2687db96d56Sopenharmony_ci __class_getitem__ = classmethod(GenericAlias) 2697db96d56Sopenharmony_ci 2707db96d56Sopenharmony_ci 2717db96d56Sopenharmony_ciclass Iterator(Iterable): 2727db96d56Sopenharmony_ci 2737db96d56Sopenharmony_ci __slots__ = () 2747db96d56Sopenharmony_ci 2757db96d56Sopenharmony_ci @abstractmethod 2767db96d56Sopenharmony_ci def __next__(self): 2777db96d56Sopenharmony_ci 'Return the next item from the iterator. When exhausted, raise StopIteration' 2787db96d56Sopenharmony_ci raise StopIteration 2797db96d56Sopenharmony_ci 2807db96d56Sopenharmony_ci def __iter__(self): 2817db96d56Sopenharmony_ci return self 2827db96d56Sopenharmony_ci 2837db96d56Sopenharmony_ci @classmethod 2847db96d56Sopenharmony_ci def __subclasshook__(cls, C): 2857db96d56Sopenharmony_ci if cls is Iterator: 2867db96d56Sopenharmony_ci return _check_methods(C, '__iter__', '__next__') 2877db96d56Sopenharmony_ci return NotImplemented 2887db96d56Sopenharmony_ci 2897db96d56Sopenharmony_ci 2907db96d56Sopenharmony_ciIterator.register(bytes_iterator) 2917db96d56Sopenharmony_ciIterator.register(bytearray_iterator) 2927db96d56Sopenharmony_ci#Iterator.register(callable_iterator) 2937db96d56Sopenharmony_ciIterator.register(dict_keyiterator) 2947db96d56Sopenharmony_ciIterator.register(dict_valueiterator) 2957db96d56Sopenharmony_ciIterator.register(dict_itemiterator) 2967db96d56Sopenharmony_ciIterator.register(list_iterator) 2977db96d56Sopenharmony_ciIterator.register(list_reverseiterator) 2987db96d56Sopenharmony_ciIterator.register(range_iterator) 2997db96d56Sopenharmony_ciIterator.register(longrange_iterator) 3007db96d56Sopenharmony_ciIterator.register(set_iterator) 3017db96d56Sopenharmony_ciIterator.register(str_iterator) 3027db96d56Sopenharmony_ciIterator.register(tuple_iterator) 3037db96d56Sopenharmony_ciIterator.register(zip_iterator) 3047db96d56Sopenharmony_ci 3057db96d56Sopenharmony_ci 3067db96d56Sopenharmony_ciclass Reversible(Iterable): 3077db96d56Sopenharmony_ci 3087db96d56Sopenharmony_ci __slots__ = () 3097db96d56Sopenharmony_ci 3107db96d56Sopenharmony_ci @abstractmethod 3117db96d56Sopenharmony_ci def __reversed__(self): 3127db96d56Sopenharmony_ci while False: 3137db96d56Sopenharmony_ci yield None 3147db96d56Sopenharmony_ci 3157db96d56Sopenharmony_ci @classmethod 3167db96d56Sopenharmony_ci def __subclasshook__(cls, C): 3177db96d56Sopenharmony_ci if cls is Reversible: 3187db96d56Sopenharmony_ci return _check_methods(C, "__reversed__", "__iter__") 3197db96d56Sopenharmony_ci return NotImplemented 3207db96d56Sopenharmony_ci 3217db96d56Sopenharmony_ci 3227db96d56Sopenharmony_ciclass Generator(Iterator): 3237db96d56Sopenharmony_ci 3247db96d56Sopenharmony_ci __slots__ = () 3257db96d56Sopenharmony_ci 3267db96d56Sopenharmony_ci def __next__(self): 3277db96d56Sopenharmony_ci """Return the next item from the generator. 3287db96d56Sopenharmony_ci When exhausted, raise StopIteration. 3297db96d56Sopenharmony_ci """ 3307db96d56Sopenharmony_ci return self.send(None) 3317db96d56Sopenharmony_ci 3327db96d56Sopenharmony_ci @abstractmethod 3337db96d56Sopenharmony_ci def send(self, value): 3347db96d56Sopenharmony_ci """Send a value into the generator. 3357db96d56Sopenharmony_ci Return next yielded value or raise StopIteration. 3367db96d56Sopenharmony_ci """ 3377db96d56Sopenharmony_ci raise StopIteration 3387db96d56Sopenharmony_ci 3397db96d56Sopenharmony_ci @abstractmethod 3407db96d56Sopenharmony_ci def throw(self, typ, val=None, tb=None): 3417db96d56Sopenharmony_ci """Raise an exception in the generator. 3427db96d56Sopenharmony_ci Return next yielded value or raise StopIteration. 3437db96d56Sopenharmony_ci """ 3447db96d56Sopenharmony_ci if val is None: 3457db96d56Sopenharmony_ci if tb is None: 3467db96d56Sopenharmony_ci raise typ 3477db96d56Sopenharmony_ci val = typ() 3487db96d56Sopenharmony_ci if tb is not None: 3497db96d56Sopenharmony_ci val = val.with_traceback(tb) 3507db96d56Sopenharmony_ci raise val 3517db96d56Sopenharmony_ci 3527db96d56Sopenharmony_ci def close(self): 3537db96d56Sopenharmony_ci """Raise GeneratorExit inside generator. 3547db96d56Sopenharmony_ci """ 3557db96d56Sopenharmony_ci try: 3567db96d56Sopenharmony_ci self.throw(GeneratorExit) 3577db96d56Sopenharmony_ci except (GeneratorExit, StopIteration): 3587db96d56Sopenharmony_ci pass 3597db96d56Sopenharmony_ci else: 3607db96d56Sopenharmony_ci raise RuntimeError("generator ignored GeneratorExit") 3617db96d56Sopenharmony_ci 3627db96d56Sopenharmony_ci @classmethod 3637db96d56Sopenharmony_ci def __subclasshook__(cls, C): 3647db96d56Sopenharmony_ci if cls is Generator: 3657db96d56Sopenharmony_ci return _check_methods(C, '__iter__', '__next__', 3667db96d56Sopenharmony_ci 'send', 'throw', 'close') 3677db96d56Sopenharmony_ci return NotImplemented 3687db96d56Sopenharmony_ci 3697db96d56Sopenharmony_ci 3707db96d56Sopenharmony_ciGenerator.register(generator) 3717db96d56Sopenharmony_ci 3727db96d56Sopenharmony_ci 3737db96d56Sopenharmony_ciclass Sized(metaclass=ABCMeta): 3747db96d56Sopenharmony_ci 3757db96d56Sopenharmony_ci __slots__ = () 3767db96d56Sopenharmony_ci 3777db96d56Sopenharmony_ci @abstractmethod 3787db96d56Sopenharmony_ci def __len__(self): 3797db96d56Sopenharmony_ci return 0 3807db96d56Sopenharmony_ci 3817db96d56Sopenharmony_ci @classmethod 3827db96d56Sopenharmony_ci def __subclasshook__(cls, C): 3837db96d56Sopenharmony_ci if cls is Sized: 3847db96d56Sopenharmony_ci return _check_methods(C, "__len__") 3857db96d56Sopenharmony_ci return NotImplemented 3867db96d56Sopenharmony_ci 3877db96d56Sopenharmony_ci 3887db96d56Sopenharmony_ciclass Container(metaclass=ABCMeta): 3897db96d56Sopenharmony_ci 3907db96d56Sopenharmony_ci __slots__ = () 3917db96d56Sopenharmony_ci 3927db96d56Sopenharmony_ci @abstractmethod 3937db96d56Sopenharmony_ci def __contains__(self, x): 3947db96d56Sopenharmony_ci return False 3957db96d56Sopenharmony_ci 3967db96d56Sopenharmony_ci @classmethod 3977db96d56Sopenharmony_ci def __subclasshook__(cls, C): 3987db96d56Sopenharmony_ci if cls is Container: 3997db96d56Sopenharmony_ci return _check_methods(C, "__contains__") 4007db96d56Sopenharmony_ci return NotImplemented 4017db96d56Sopenharmony_ci 4027db96d56Sopenharmony_ci __class_getitem__ = classmethod(GenericAlias) 4037db96d56Sopenharmony_ci 4047db96d56Sopenharmony_ci 4057db96d56Sopenharmony_ciclass Collection(Sized, Iterable, Container): 4067db96d56Sopenharmony_ci 4077db96d56Sopenharmony_ci __slots__ = () 4087db96d56Sopenharmony_ci 4097db96d56Sopenharmony_ci @classmethod 4107db96d56Sopenharmony_ci def __subclasshook__(cls, C): 4117db96d56Sopenharmony_ci if cls is Collection: 4127db96d56Sopenharmony_ci return _check_methods(C, "__len__", "__iter__", "__contains__") 4137db96d56Sopenharmony_ci return NotImplemented 4147db96d56Sopenharmony_ci 4157db96d56Sopenharmony_ci 4167db96d56Sopenharmony_ciclass _CallableGenericAlias(GenericAlias): 4177db96d56Sopenharmony_ci """ Represent `Callable[argtypes, resulttype]`. 4187db96d56Sopenharmony_ci 4197db96d56Sopenharmony_ci This sets ``__args__`` to a tuple containing the flattened ``argtypes`` 4207db96d56Sopenharmony_ci followed by ``resulttype``. 4217db96d56Sopenharmony_ci 4227db96d56Sopenharmony_ci Example: ``Callable[[int, str], float]`` sets ``__args__`` to 4237db96d56Sopenharmony_ci ``(int, str, float)``. 4247db96d56Sopenharmony_ci """ 4257db96d56Sopenharmony_ci 4267db96d56Sopenharmony_ci __slots__ = () 4277db96d56Sopenharmony_ci 4287db96d56Sopenharmony_ci def __new__(cls, origin, args): 4297db96d56Sopenharmony_ci if not (isinstance(args, tuple) and len(args) == 2): 4307db96d56Sopenharmony_ci raise TypeError( 4317db96d56Sopenharmony_ci "Callable must be used as Callable[[arg, ...], result].") 4327db96d56Sopenharmony_ci t_args, t_result = args 4337db96d56Sopenharmony_ci if isinstance(t_args, (tuple, list)): 4347db96d56Sopenharmony_ci args = (*t_args, t_result) 4357db96d56Sopenharmony_ci elif not _is_param_expr(t_args): 4367db96d56Sopenharmony_ci raise TypeError(f"Expected a list of types, an ellipsis, " 4377db96d56Sopenharmony_ci f"ParamSpec, or Concatenate. Got {t_args}") 4387db96d56Sopenharmony_ci return super().__new__(cls, origin, args) 4397db96d56Sopenharmony_ci 4407db96d56Sopenharmony_ci def __repr__(self): 4417db96d56Sopenharmony_ci if len(self.__args__) == 2 and _is_param_expr(self.__args__[0]): 4427db96d56Sopenharmony_ci return super().__repr__() 4437db96d56Sopenharmony_ci return (f'collections.abc.Callable' 4447db96d56Sopenharmony_ci f'[[{", ".join([_type_repr(a) for a in self.__args__[:-1]])}], ' 4457db96d56Sopenharmony_ci f'{_type_repr(self.__args__[-1])}]') 4467db96d56Sopenharmony_ci 4477db96d56Sopenharmony_ci def __reduce__(self): 4487db96d56Sopenharmony_ci args = self.__args__ 4497db96d56Sopenharmony_ci if not (len(args) == 2 and _is_param_expr(args[0])): 4507db96d56Sopenharmony_ci args = list(args[:-1]), args[-1] 4517db96d56Sopenharmony_ci return _CallableGenericAlias, (Callable, args) 4527db96d56Sopenharmony_ci 4537db96d56Sopenharmony_ci def __getitem__(self, item): 4547db96d56Sopenharmony_ci # Called during TypeVar substitution, returns the custom subclass 4557db96d56Sopenharmony_ci # rather than the default types.GenericAlias object. Most of the 4567db96d56Sopenharmony_ci # code is copied from typing's _GenericAlias and the builtin 4577db96d56Sopenharmony_ci # types.GenericAlias. 4587db96d56Sopenharmony_ci 4597db96d56Sopenharmony_ci if not isinstance(item, tuple): 4607db96d56Sopenharmony_ci item = (item,) 4617db96d56Sopenharmony_ci # A special case in PEP 612 where if X = Callable[P, int], 4627db96d56Sopenharmony_ci # then X[int, str] == X[[int, str]]. 4637db96d56Sopenharmony_ci if (len(self.__parameters__) == 1 4647db96d56Sopenharmony_ci and _is_param_expr(self.__parameters__[0]) 4657db96d56Sopenharmony_ci and item and not _is_param_expr(item[0])): 4667db96d56Sopenharmony_ci item = (item,) 4677db96d56Sopenharmony_ci 4687db96d56Sopenharmony_ci new_args = super().__getitem__(item).__args__ 4697db96d56Sopenharmony_ci 4707db96d56Sopenharmony_ci # args[0] occurs due to things like Z[[int, str, bool]] from PEP 612 4717db96d56Sopenharmony_ci if not isinstance(new_args[0], (tuple, list)): 4727db96d56Sopenharmony_ci t_result = new_args[-1] 4737db96d56Sopenharmony_ci t_args = new_args[:-1] 4747db96d56Sopenharmony_ci new_args = (t_args, t_result) 4757db96d56Sopenharmony_ci return _CallableGenericAlias(Callable, tuple(new_args)) 4767db96d56Sopenharmony_ci 4777db96d56Sopenharmony_cidef _is_param_expr(obj): 4787db96d56Sopenharmony_ci """Checks if obj matches either a list of types, ``...``, ``ParamSpec`` or 4797db96d56Sopenharmony_ci ``_ConcatenateGenericAlias`` from typing.py 4807db96d56Sopenharmony_ci """ 4817db96d56Sopenharmony_ci if obj is Ellipsis: 4827db96d56Sopenharmony_ci return True 4837db96d56Sopenharmony_ci if isinstance(obj, list): 4847db96d56Sopenharmony_ci return True 4857db96d56Sopenharmony_ci obj = type(obj) 4867db96d56Sopenharmony_ci names = ('ParamSpec', '_ConcatenateGenericAlias') 4877db96d56Sopenharmony_ci return obj.__module__ == 'typing' and any(obj.__name__ == name for name in names) 4887db96d56Sopenharmony_ci 4897db96d56Sopenharmony_cidef _type_repr(obj): 4907db96d56Sopenharmony_ci """Return the repr() of an object, special-casing types (internal helper). 4917db96d56Sopenharmony_ci 4927db96d56Sopenharmony_ci Copied from :mod:`typing` since collections.abc 4937db96d56Sopenharmony_ci shouldn't depend on that module. 4947db96d56Sopenharmony_ci """ 4957db96d56Sopenharmony_ci if isinstance(obj, GenericAlias): 4967db96d56Sopenharmony_ci return repr(obj) 4977db96d56Sopenharmony_ci if isinstance(obj, type): 4987db96d56Sopenharmony_ci if obj.__module__ == 'builtins': 4997db96d56Sopenharmony_ci return obj.__qualname__ 5007db96d56Sopenharmony_ci return f'{obj.__module__}.{obj.__qualname__}' 5017db96d56Sopenharmony_ci if obj is Ellipsis: 5027db96d56Sopenharmony_ci return '...' 5037db96d56Sopenharmony_ci if isinstance(obj, FunctionType): 5047db96d56Sopenharmony_ci return obj.__name__ 5057db96d56Sopenharmony_ci return repr(obj) 5067db96d56Sopenharmony_ci 5077db96d56Sopenharmony_ci 5087db96d56Sopenharmony_ciclass Callable(metaclass=ABCMeta): 5097db96d56Sopenharmony_ci 5107db96d56Sopenharmony_ci __slots__ = () 5117db96d56Sopenharmony_ci 5127db96d56Sopenharmony_ci @abstractmethod 5137db96d56Sopenharmony_ci def __call__(self, *args, **kwds): 5147db96d56Sopenharmony_ci return False 5157db96d56Sopenharmony_ci 5167db96d56Sopenharmony_ci @classmethod 5177db96d56Sopenharmony_ci def __subclasshook__(cls, C): 5187db96d56Sopenharmony_ci if cls is Callable: 5197db96d56Sopenharmony_ci return _check_methods(C, "__call__") 5207db96d56Sopenharmony_ci return NotImplemented 5217db96d56Sopenharmony_ci 5227db96d56Sopenharmony_ci __class_getitem__ = classmethod(_CallableGenericAlias) 5237db96d56Sopenharmony_ci 5247db96d56Sopenharmony_ci 5257db96d56Sopenharmony_ci### SETS ### 5267db96d56Sopenharmony_ci 5277db96d56Sopenharmony_ci 5287db96d56Sopenharmony_ciclass Set(Collection): 5297db96d56Sopenharmony_ci """A set is a finite, iterable container. 5307db96d56Sopenharmony_ci 5317db96d56Sopenharmony_ci This class provides concrete generic implementations of all 5327db96d56Sopenharmony_ci methods except for __contains__, __iter__ and __len__. 5337db96d56Sopenharmony_ci 5347db96d56Sopenharmony_ci To override the comparisons (presumably for speed, as the 5357db96d56Sopenharmony_ci semantics are fixed), redefine __le__ and __ge__, 5367db96d56Sopenharmony_ci then the other operations will automatically follow suit. 5377db96d56Sopenharmony_ci """ 5387db96d56Sopenharmony_ci 5397db96d56Sopenharmony_ci __slots__ = () 5407db96d56Sopenharmony_ci 5417db96d56Sopenharmony_ci def __le__(self, other): 5427db96d56Sopenharmony_ci if not isinstance(other, Set): 5437db96d56Sopenharmony_ci return NotImplemented 5447db96d56Sopenharmony_ci if len(self) > len(other): 5457db96d56Sopenharmony_ci return False 5467db96d56Sopenharmony_ci for elem in self: 5477db96d56Sopenharmony_ci if elem not in other: 5487db96d56Sopenharmony_ci return False 5497db96d56Sopenharmony_ci return True 5507db96d56Sopenharmony_ci 5517db96d56Sopenharmony_ci def __lt__(self, other): 5527db96d56Sopenharmony_ci if not isinstance(other, Set): 5537db96d56Sopenharmony_ci return NotImplemented 5547db96d56Sopenharmony_ci return len(self) < len(other) and self.__le__(other) 5557db96d56Sopenharmony_ci 5567db96d56Sopenharmony_ci def __gt__(self, other): 5577db96d56Sopenharmony_ci if not isinstance(other, Set): 5587db96d56Sopenharmony_ci return NotImplemented 5597db96d56Sopenharmony_ci return len(self) > len(other) and self.__ge__(other) 5607db96d56Sopenharmony_ci 5617db96d56Sopenharmony_ci def __ge__(self, other): 5627db96d56Sopenharmony_ci if not isinstance(other, Set): 5637db96d56Sopenharmony_ci return NotImplemented 5647db96d56Sopenharmony_ci if len(self) < len(other): 5657db96d56Sopenharmony_ci return False 5667db96d56Sopenharmony_ci for elem in other: 5677db96d56Sopenharmony_ci if elem not in self: 5687db96d56Sopenharmony_ci return False 5697db96d56Sopenharmony_ci return True 5707db96d56Sopenharmony_ci 5717db96d56Sopenharmony_ci def __eq__(self, other): 5727db96d56Sopenharmony_ci if not isinstance(other, Set): 5737db96d56Sopenharmony_ci return NotImplemented 5747db96d56Sopenharmony_ci return len(self) == len(other) and self.__le__(other) 5757db96d56Sopenharmony_ci 5767db96d56Sopenharmony_ci @classmethod 5777db96d56Sopenharmony_ci def _from_iterable(cls, it): 5787db96d56Sopenharmony_ci '''Construct an instance of the class from any iterable input. 5797db96d56Sopenharmony_ci 5807db96d56Sopenharmony_ci Must override this method if the class constructor signature 5817db96d56Sopenharmony_ci does not accept an iterable for an input. 5827db96d56Sopenharmony_ci ''' 5837db96d56Sopenharmony_ci return cls(it) 5847db96d56Sopenharmony_ci 5857db96d56Sopenharmony_ci def __and__(self, other): 5867db96d56Sopenharmony_ci if not isinstance(other, Iterable): 5877db96d56Sopenharmony_ci return NotImplemented 5887db96d56Sopenharmony_ci return self._from_iterable(value for value in other if value in self) 5897db96d56Sopenharmony_ci 5907db96d56Sopenharmony_ci __rand__ = __and__ 5917db96d56Sopenharmony_ci 5927db96d56Sopenharmony_ci def isdisjoint(self, other): 5937db96d56Sopenharmony_ci 'Return True if two sets have a null intersection.' 5947db96d56Sopenharmony_ci for value in other: 5957db96d56Sopenharmony_ci if value in self: 5967db96d56Sopenharmony_ci return False 5977db96d56Sopenharmony_ci return True 5987db96d56Sopenharmony_ci 5997db96d56Sopenharmony_ci def __or__(self, other): 6007db96d56Sopenharmony_ci if not isinstance(other, Iterable): 6017db96d56Sopenharmony_ci return NotImplemented 6027db96d56Sopenharmony_ci chain = (e for s in (self, other) for e in s) 6037db96d56Sopenharmony_ci return self._from_iterable(chain) 6047db96d56Sopenharmony_ci 6057db96d56Sopenharmony_ci __ror__ = __or__ 6067db96d56Sopenharmony_ci 6077db96d56Sopenharmony_ci def __sub__(self, other): 6087db96d56Sopenharmony_ci if not isinstance(other, Set): 6097db96d56Sopenharmony_ci if not isinstance(other, Iterable): 6107db96d56Sopenharmony_ci return NotImplemented 6117db96d56Sopenharmony_ci other = self._from_iterable(other) 6127db96d56Sopenharmony_ci return self._from_iterable(value for value in self 6137db96d56Sopenharmony_ci if value not in other) 6147db96d56Sopenharmony_ci 6157db96d56Sopenharmony_ci def __rsub__(self, other): 6167db96d56Sopenharmony_ci if not isinstance(other, Set): 6177db96d56Sopenharmony_ci if not isinstance(other, Iterable): 6187db96d56Sopenharmony_ci return NotImplemented 6197db96d56Sopenharmony_ci other = self._from_iterable(other) 6207db96d56Sopenharmony_ci return self._from_iterable(value for value in other 6217db96d56Sopenharmony_ci if value not in self) 6227db96d56Sopenharmony_ci 6237db96d56Sopenharmony_ci def __xor__(self, other): 6247db96d56Sopenharmony_ci if not isinstance(other, Set): 6257db96d56Sopenharmony_ci if not isinstance(other, Iterable): 6267db96d56Sopenharmony_ci return NotImplemented 6277db96d56Sopenharmony_ci other = self._from_iterable(other) 6287db96d56Sopenharmony_ci return (self - other) | (other - self) 6297db96d56Sopenharmony_ci 6307db96d56Sopenharmony_ci __rxor__ = __xor__ 6317db96d56Sopenharmony_ci 6327db96d56Sopenharmony_ci def _hash(self): 6337db96d56Sopenharmony_ci """Compute the hash value of a set. 6347db96d56Sopenharmony_ci 6357db96d56Sopenharmony_ci Note that we don't define __hash__: not all sets are hashable. 6367db96d56Sopenharmony_ci But if you define a hashable set type, its __hash__ should 6377db96d56Sopenharmony_ci call this function. 6387db96d56Sopenharmony_ci 6397db96d56Sopenharmony_ci This must be compatible __eq__. 6407db96d56Sopenharmony_ci 6417db96d56Sopenharmony_ci All sets ought to compare equal if they contain the same 6427db96d56Sopenharmony_ci elements, regardless of how they are implemented, and 6437db96d56Sopenharmony_ci regardless of the order of the elements; so there's not much 6447db96d56Sopenharmony_ci freedom for __eq__ or __hash__. We match the algorithm used 6457db96d56Sopenharmony_ci by the built-in frozenset type. 6467db96d56Sopenharmony_ci """ 6477db96d56Sopenharmony_ci MAX = sys.maxsize 6487db96d56Sopenharmony_ci MASK = 2 * MAX + 1 6497db96d56Sopenharmony_ci n = len(self) 6507db96d56Sopenharmony_ci h = 1927868237 * (n + 1) 6517db96d56Sopenharmony_ci h &= MASK 6527db96d56Sopenharmony_ci for x in self: 6537db96d56Sopenharmony_ci hx = hash(x) 6547db96d56Sopenharmony_ci h ^= (hx ^ (hx << 16) ^ 89869747) * 3644798167 6557db96d56Sopenharmony_ci h &= MASK 6567db96d56Sopenharmony_ci h ^= (h >> 11) ^ (h >> 25) 6577db96d56Sopenharmony_ci h = h * 69069 + 907133923 6587db96d56Sopenharmony_ci h &= MASK 6597db96d56Sopenharmony_ci if h > MAX: 6607db96d56Sopenharmony_ci h -= MASK + 1 6617db96d56Sopenharmony_ci if h == -1: 6627db96d56Sopenharmony_ci h = 590923713 6637db96d56Sopenharmony_ci return h 6647db96d56Sopenharmony_ci 6657db96d56Sopenharmony_ci 6667db96d56Sopenharmony_ciSet.register(frozenset) 6677db96d56Sopenharmony_ci 6687db96d56Sopenharmony_ci 6697db96d56Sopenharmony_ciclass MutableSet(Set): 6707db96d56Sopenharmony_ci """A mutable set is a finite, iterable container. 6717db96d56Sopenharmony_ci 6727db96d56Sopenharmony_ci This class provides concrete generic implementations of all 6737db96d56Sopenharmony_ci methods except for __contains__, __iter__, __len__, 6747db96d56Sopenharmony_ci add(), and discard(). 6757db96d56Sopenharmony_ci 6767db96d56Sopenharmony_ci To override the comparisons (presumably for speed, as the 6777db96d56Sopenharmony_ci semantics are fixed), all you have to do is redefine __le__ and 6787db96d56Sopenharmony_ci then the other operations will automatically follow suit. 6797db96d56Sopenharmony_ci """ 6807db96d56Sopenharmony_ci 6817db96d56Sopenharmony_ci __slots__ = () 6827db96d56Sopenharmony_ci 6837db96d56Sopenharmony_ci @abstractmethod 6847db96d56Sopenharmony_ci def add(self, value): 6857db96d56Sopenharmony_ci """Add an element.""" 6867db96d56Sopenharmony_ci raise NotImplementedError 6877db96d56Sopenharmony_ci 6887db96d56Sopenharmony_ci @abstractmethod 6897db96d56Sopenharmony_ci def discard(self, value): 6907db96d56Sopenharmony_ci """Remove an element. Do not raise an exception if absent.""" 6917db96d56Sopenharmony_ci raise NotImplementedError 6927db96d56Sopenharmony_ci 6937db96d56Sopenharmony_ci def remove(self, value): 6947db96d56Sopenharmony_ci """Remove an element. If not a member, raise a KeyError.""" 6957db96d56Sopenharmony_ci if value not in self: 6967db96d56Sopenharmony_ci raise KeyError(value) 6977db96d56Sopenharmony_ci self.discard(value) 6987db96d56Sopenharmony_ci 6997db96d56Sopenharmony_ci def pop(self): 7007db96d56Sopenharmony_ci """Return the popped value. Raise KeyError if empty.""" 7017db96d56Sopenharmony_ci it = iter(self) 7027db96d56Sopenharmony_ci try: 7037db96d56Sopenharmony_ci value = next(it) 7047db96d56Sopenharmony_ci except StopIteration: 7057db96d56Sopenharmony_ci raise KeyError from None 7067db96d56Sopenharmony_ci self.discard(value) 7077db96d56Sopenharmony_ci return value 7087db96d56Sopenharmony_ci 7097db96d56Sopenharmony_ci def clear(self): 7107db96d56Sopenharmony_ci """This is slow (creates N new iterators!) but effective.""" 7117db96d56Sopenharmony_ci try: 7127db96d56Sopenharmony_ci while True: 7137db96d56Sopenharmony_ci self.pop() 7147db96d56Sopenharmony_ci except KeyError: 7157db96d56Sopenharmony_ci pass 7167db96d56Sopenharmony_ci 7177db96d56Sopenharmony_ci def __ior__(self, it): 7187db96d56Sopenharmony_ci for value in it: 7197db96d56Sopenharmony_ci self.add(value) 7207db96d56Sopenharmony_ci return self 7217db96d56Sopenharmony_ci 7227db96d56Sopenharmony_ci def __iand__(self, it): 7237db96d56Sopenharmony_ci for value in (self - it): 7247db96d56Sopenharmony_ci self.discard(value) 7257db96d56Sopenharmony_ci return self 7267db96d56Sopenharmony_ci 7277db96d56Sopenharmony_ci def __ixor__(self, it): 7287db96d56Sopenharmony_ci if it is self: 7297db96d56Sopenharmony_ci self.clear() 7307db96d56Sopenharmony_ci else: 7317db96d56Sopenharmony_ci if not isinstance(it, Set): 7327db96d56Sopenharmony_ci it = self._from_iterable(it) 7337db96d56Sopenharmony_ci for value in it: 7347db96d56Sopenharmony_ci if value in self: 7357db96d56Sopenharmony_ci self.discard(value) 7367db96d56Sopenharmony_ci else: 7377db96d56Sopenharmony_ci self.add(value) 7387db96d56Sopenharmony_ci return self 7397db96d56Sopenharmony_ci 7407db96d56Sopenharmony_ci def __isub__(self, it): 7417db96d56Sopenharmony_ci if it is self: 7427db96d56Sopenharmony_ci self.clear() 7437db96d56Sopenharmony_ci else: 7447db96d56Sopenharmony_ci for value in it: 7457db96d56Sopenharmony_ci self.discard(value) 7467db96d56Sopenharmony_ci return self 7477db96d56Sopenharmony_ci 7487db96d56Sopenharmony_ci 7497db96d56Sopenharmony_ciMutableSet.register(set) 7507db96d56Sopenharmony_ci 7517db96d56Sopenharmony_ci 7527db96d56Sopenharmony_ci### MAPPINGS ### 7537db96d56Sopenharmony_ci 7547db96d56Sopenharmony_ciclass Mapping(Collection): 7557db96d56Sopenharmony_ci """A Mapping is a generic container for associating key/value 7567db96d56Sopenharmony_ci pairs. 7577db96d56Sopenharmony_ci 7587db96d56Sopenharmony_ci This class provides concrete generic implementations of all 7597db96d56Sopenharmony_ci methods except for __getitem__, __iter__, and __len__. 7607db96d56Sopenharmony_ci """ 7617db96d56Sopenharmony_ci 7627db96d56Sopenharmony_ci __slots__ = () 7637db96d56Sopenharmony_ci 7647db96d56Sopenharmony_ci # Tell ABCMeta.__new__ that this class should have TPFLAGS_MAPPING set. 7657db96d56Sopenharmony_ci __abc_tpflags__ = 1 << 6 # Py_TPFLAGS_MAPPING 7667db96d56Sopenharmony_ci 7677db96d56Sopenharmony_ci @abstractmethod 7687db96d56Sopenharmony_ci def __getitem__(self, key): 7697db96d56Sopenharmony_ci raise KeyError 7707db96d56Sopenharmony_ci 7717db96d56Sopenharmony_ci def get(self, key, default=None): 7727db96d56Sopenharmony_ci 'D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.' 7737db96d56Sopenharmony_ci try: 7747db96d56Sopenharmony_ci return self[key] 7757db96d56Sopenharmony_ci except KeyError: 7767db96d56Sopenharmony_ci return default 7777db96d56Sopenharmony_ci 7787db96d56Sopenharmony_ci def __contains__(self, key): 7797db96d56Sopenharmony_ci try: 7807db96d56Sopenharmony_ci self[key] 7817db96d56Sopenharmony_ci except KeyError: 7827db96d56Sopenharmony_ci return False 7837db96d56Sopenharmony_ci else: 7847db96d56Sopenharmony_ci return True 7857db96d56Sopenharmony_ci 7867db96d56Sopenharmony_ci def keys(self): 7877db96d56Sopenharmony_ci "D.keys() -> a set-like object providing a view on D's keys" 7887db96d56Sopenharmony_ci return KeysView(self) 7897db96d56Sopenharmony_ci 7907db96d56Sopenharmony_ci def items(self): 7917db96d56Sopenharmony_ci "D.items() -> a set-like object providing a view on D's items" 7927db96d56Sopenharmony_ci return ItemsView(self) 7937db96d56Sopenharmony_ci 7947db96d56Sopenharmony_ci def values(self): 7957db96d56Sopenharmony_ci "D.values() -> an object providing a view on D's values" 7967db96d56Sopenharmony_ci return ValuesView(self) 7977db96d56Sopenharmony_ci 7987db96d56Sopenharmony_ci def __eq__(self, other): 7997db96d56Sopenharmony_ci if not isinstance(other, Mapping): 8007db96d56Sopenharmony_ci return NotImplemented 8017db96d56Sopenharmony_ci return dict(self.items()) == dict(other.items()) 8027db96d56Sopenharmony_ci 8037db96d56Sopenharmony_ci __reversed__ = None 8047db96d56Sopenharmony_ci 8057db96d56Sopenharmony_ciMapping.register(mappingproxy) 8067db96d56Sopenharmony_ci 8077db96d56Sopenharmony_ci 8087db96d56Sopenharmony_ciclass MappingView(Sized): 8097db96d56Sopenharmony_ci 8107db96d56Sopenharmony_ci __slots__ = '_mapping', 8117db96d56Sopenharmony_ci 8127db96d56Sopenharmony_ci def __init__(self, mapping): 8137db96d56Sopenharmony_ci self._mapping = mapping 8147db96d56Sopenharmony_ci 8157db96d56Sopenharmony_ci def __len__(self): 8167db96d56Sopenharmony_ci return len(self._mapping) 8177db96d56Sopenharmony_ci 8187db96d56Sopenharmony_ci def __repr__(self): 8197db96d56Sopenharmony_ci return '{0.__class__.__name__}({0._mapping!r})'.format(self) 8207db96d56Sopenharmony_ci 8217db96d56Sopenharmony_ci __class_getitem__ = classmethod(GenericAlias) 8227db96d56Sopenharmony_ci 8237db96d56Sopenharmony_ci 8247db96d56Sopenharmony_ciclass KeysView(MappingView, Set): 8257db96d56Sopenharmony_ci 8267db96d56Sopenharmony_ci __slots__ = () 8277db96d56Sopenharmony_ci 8287db96d56Sopenharmony_ci @classmethod 8297db96d56Sopenharmony_ci def _from_iterable(cls, it): 8307db96d56Sopenharmony_ci return set(it) 8317db96d56Sopenharmony_ci 8327db96d56Sopenharmony_ci def __contains__(self, key): 8337db96d56Sopenharmony_ci return key in self._mapping 8347db96d56Sopenharmony_ci 8357db96d56Sopenharmony_ci def __iter__(self): 8367db96d56Sopenharmony_ci yield from self._mapping 8377db96d56Sopenharmony_ci 8387db96d56Sopenharmony_ci 8397db96d56Sopenharmony_ciKeysView.register(dict_keys) 8407db96d56Sopenharmony_ci 8417db96d56Sopenharmony_ci 8427db96d56Sopenharmony_ciclass ItemsView(MappingView, Set): 8437db96d56Sopenharmony_ci 8447db96d56Sopenharmony_ci __slots__ = () 8457db96d56Sopenharmony_ci 8467db96d56Sopenharmony_ci @classmethod 8477db96d56Sopenharmony_ci def _from_iterable(cls, it): 8487db96d56Sopenharmony_ci return set(it) 8497db96d56Sopenharmony_ci 8507db96d56Sopenharmony_ci def __contains__(self, item): 8517db96d56Sopenharmony_ci key, value = item 8527db96d56Sopenharmony_ci try: 8537db96d56Sopenharmony_ci v = self._mapping[key] 8547db96d56Sopenharmony_ci except KeyError: 8557db96d56Sopenharmony_ci return False 8567db96d56Sopenharmony_ci else: 8577db96d56Sopenharmony_ci return v is value or v == value 8587db96d56Sopenharmony_ci 8597db96d56Sopenharmony_ci def __iter__(self): 8607db96d56Sopenharmony_ci for key in self._mapping: 8617db96d56Sopenharmony_ci yield (key, self._mapping[key]) 8627db96d56Sopenharmony_ci 8637db96d56Sopenharmony_ci 8647db96d56Sopenharmony_ciItemsView.register(dict_items) 8657db96d56Sopenharmony_ci 8667db96d56Sopenharmony_ci 8677db96d56Sopenharmony_ciclass ValuesView(MappingView, Collection): 8687db96d56Sopenharmony_ci 8697db96d56Sopenharmony_ci __slots__ = () 8707db96d56Sopenharmony_ci 8717db96d56Sopenharmony_ci def __contains__(self, value): 8727db96d56Sopenharmony_ci for key in self._mapping: 8737db96d56Sopenharmony_ci v = self._mapping[key] 8747db96d56Sopenharmony_ci if v is value or v == value: 8757db96d56Sopenharmony_ci return True 8767db96d56Sopenharmony_ci return False 8777db96d56Sopenharmony_ci 8787db96d56Sopenharmony_ci def __iter__(self): 8797db96d56Sopenharmony_ci for key in self._mapping: 8807db96d56Sopenharmony_ci yield self._mapping[key] 8817db96d56Sopenharmony_ci 8827db96d56Sopenharmony_ci 8837db96d56Sopenharmony_ciValuesView.register(dict_values) 8847db96d56Sopenharmony_ci 8857db96d56Sopenharmony_ci 8867db96d56Sopenharmony_ciclass MutableMapping(Mapping): 8877db96d56Sopenharmony_ci """A MutableMapping is a generic container for associating 8887db96d56Sopenharmony_ci key/value pairs. 8897db96d56Sopenharmony_ci 8907db96d56Sopenharmony_ci This class provides concrete generic implementations of all 8917db96d56Sopenharmony_ci methods except for __getitem__, __setitem__, __delitem__, 8927db96d56Sopenharmony_ci __iter__, and __len__. 8937db96d56Sopenharmony_ci """ 8947db96d56Sopenharmony_ci 8957db96d56Sopenharmony_ci __slots__ = () 8967db96d56Sopenharmony_ci 8977db96d56Sopenharmony_ci @abstractmethod 8987db96d56Sopenharmony_ci def __setitem__(self, key, value): 8997db96d56Sopenharmony_ci raise KeyError 9007db96d56Sopenharmony_ci 9017db96d56Sopenharmony_ci @abstractmethod 9027db96d56Sopenharmony_ci def __delitem__(self, key): 9037db96d56Sopenharmony_ci raise KeyError 9047db96d56Sopenharmony_ci 9057db96d56Sopenharmony_ci __marker = object() 9067db96d56Sopenharmony_ci 9077db96d56Sopenharmony_ci def pop(self, key, default=__marker): 9087db96d56Sopenharmony_ci '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value. 9097db96d56Sopenharmony_ci If key is not found, d is returned if given, otherwise KeyError is raised. 9107db96d56Sopenharmony_ci ''' 9117db96d56Sopenharmony_ci try: 9127db96d56Sopenharmony_ci value = self[key] 9137db96d56Sopenharmony_ci except KeyError: 9147db96d56Sopenharmony_ci if default is self.__marker: 9157db96d56Sopenharmony_ci raise 9167db96d56Sopenharmony_ci return default 9177db96d56Sopenharmony_ci else: 9187db96d56Sopenharmony_ci del self[key] 9197db96d56Sopenharmony_ci return value 9207db96d56Sopenharmony_ci 9217db96d56Sopenharmony_ci def popitem(self): 9227db96d56Sopenharmony_ci '''D.popitem() -> (k, v), remove and return some (key, value) pair 9237db96d56Sopenharmony_ci as a 2-tuple; but raise KeyError if D is empty. 9247db96d56Sopenharmony_ci ''' 9257db96d56Sopenharmony_ci try: 9267db96d56Sopenharmony_ci key = next(iter(self)) 9277db96d56Sopenharmony_ci except StopIteration: 9287db96d56Sopenharmony_ci raise KeyError from None 9297db96d56Sopenharmony_ci value = self[key] 9307db96d56Sopenharmony_ci del self[key] 9317db96d56Sopenharmony_ci return key, value 9327db96d56Sopenharmony_ci 9337db96d56Sopenharmony_ci def clear(self): 9347db96d56Sopenharmony_ci 'D.clear() -> None. Remove all items from D.' 9357db96d56Sopenharmony_ci try: 9367db96d56Sopenharmony_ci while True: 9377db96d56Sopenharmony_ci self.popitem() 9387db96d56Sopenharmony_ci except KeyError: 9397db96d56Sopenharmony_ci pass 9407db96d56Sopenharmony_ci 9417db96d56Sopenharmony_ci def update(self, other=(), /, **kwds): 9427db96d56Sopenharmony_ci ''' D.update([E, ]**F) -> None. Update D from mapping/iterable E and F. 9437db96d56Sopenharmony_ci If E present and has a .keys() method, does: for k in E: D[k] = E[k] 9447db96d56Sopenharmony_ci If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v 9457db96d56Sopenharmony_ci In either case, this is followed by: for k, v in F.items(): D[k] = v 9467db96d56Sopenharmony_ci ''' 9477db96d56Sopenharmony_ci if isinstance(other, Mapping): 9487db96d56Sopenharmony_ci for key in other: 9497db96d56Sopenharmony_ci self[key] = other[key] 9507db96d56Sopenharmony_ci elif hasattr(other, "keys"): 9517db96d56Sopenharmony_ci for key in other.keys(): 9527db96d56Sopenharmony_ci self[key] = other[key] 9537db96d56Sopenharmony_ci else: 9547db96d56Sopenharmony_ci for key, value in other: 9557db96d56Sopenharmony_ci self[key] = value 9567db96d56Sopenharmony_ci for key, value in kwds.items(): 9577db96d56Sopenharmony_ci self[key] = value 9587db96d56Sopenharmony_ci 9597db96d56Sopenharmony_ci def setdefault(self, key, default=None): 9607db96d56Sopenharmony_ci 'D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D' 9617db96d56Sopenharmony_ci try: 9627db96d56Sopenharmony_ci return self[key] 9637db96d56Sopenharmony_ci except KeyError: 9647db96d56Sopenharmony_ci self[key] = default 9657db96d56Sopenharmony_ci return default 9667db96d56Sopenharmony_ci 9677db96d56Sopenharmony_ci 9687db96d56Sopenharmony_ciMutableMapping.register(dict) 9697db96d56Sopenharmony_ci 9707db96d56Sopenharmony_ci 9717db96d56Sopenharmony_ci### SEQUENCES ### 9727db96d56Sopenharmony_ci 9737db96d56Sopenharmony_ciclass Sequence(Reversible, Collection): 9747db96d56Sopenharmony_ci """All the operations on a read-only sequence. 9757db96d56Sopenharmony_ci 9767db96d56Sopenharmony_ci Concrete subclasses must override __new__ or __init__, 9777db96d56Sopenharmony_ci __getitem__, and __len__. 9787db96d56Sopenharmony_ci """ 9797db96d56Sopenharmony_ci 9807db96d56Sopenharmony_ci __slots__ = () 9817db96d56Sopenharmony_ci 9827db96d56Sopenharmony_ci # Tell ABCMeta.__new__ that this class should have TPFLAGS_SEQUENCE set. 9837db96d56Sopenharmony_ci __abc_tpflags__ = 1 << 5 # Py_TPFLAGS_SEQUENCE 9847db96d56Sopenharmony_ci 9857db96d56Sopenharmony_ci @abstractmethod 9867db96d56Sopenharmony_ci def __getitem__(self, index): 9877db96d56Sopenharmony_ci raise IndexError 9887db96d56Sopenharmony_ci 9897db96d56Sopenharmony_ci def __iter__(self): 9907db96d56Sopenharmony_ci i = 0 9917db96d56Sopenharmony_ci try: 9927db96d56Sopenharmony_ci while True: 9937db96d56Sopenharmony_ci v = self[i] 9947db96d56Sopenharmony_ci yield v 9957db96d56Sopenharmony_ci i += 1 9967db96d56Sopenharmony_ci except IndexError: 9977db96d56Sopenharmony_ci return 9987db96d56Sopenharmony_ci 9997db96d56Sopenharmony_ci def __contains__(self, value): 10007db96d56Sopenharmony_ci for v in self: 10017db96d56Sopenharmony_ci if v is value or v == value: 10027db96d56Sopenharmony_ci return True 10037db96d56Sopenharmony_ci return False 10047db96d56Sopenharmony_ci 10057db96d56Sopenharmony_ci def __reversed__(self): 10067db96d56Sopenharmony_ci for i in reversed(range(len(self))): 10077db96d56Sopenharmony_ci yield self[i] 10087db96d56Sopenharmony_ci 10097db96d56Sopenharmony_ci def index(self, value, start=0, stop=None): 10107db96d56Sopenharmony_ci '''S.index(value, [start, [stop]]) -> integer -- return first index of value. 10117db96d56Sopenharmony_ci Raises ValueError if the value is not present. 10127db96d56Sopenharmony_ci 10137db96d56Sopenharmony_ci Supporting start and stop arguments is optional, but 10147db96d56Sopenharmony_ci recommended. 10157db96d56Sopenharmony_ci ''' 10167db96d56Sopenharmony_ci if start is not None and start < 0: 10177db96d56Sopenharmony_ci start = max(len(self) + start, 0) 10187db96d56Sopenharmony_ci if stop is not None and stop < 0: 10197db96d56Sopenharmony_ci stop += len(self) 10207db96d56Sopenharmony_ci 10217db96d56Sopenharmony_ci i = start 10227db96d56Sopenharmony_ci while stop is None or i < stop: 10237db96d56Sopenharmony_ci try: 10247db96d56Sopenharmony_ci v = self[i] 10257db96d56Sopenharmony_ci except IndexError: 10267db96d56Sopenharmony_ci break 10277db96d56Sopenharmony_ci if v is value or v == value: 10287db96d56Sopenharmony_ci return i 10297db96d56Sopenharmony_ci i += 1 10307db96d56Sopenharmony_ci raise ValueError 10317db96d56Sopenharmony_ci 10327db96d56Sopenharmony_ci def count(self, value): 10337db96d56Sopenharmony_ci 'S.count(value) -> integer -- return number of occurrences of value' 10347db96d56Sopenharmony_ci return sum(1 for v in self if v is value or v == value) 10357db96d56Sopenharmony_ci 10367db96d56Sopenharmony_ciSequence.register(tuple) 10377db96d56Sopenharmony_ciSequence.register(str) 10387db96d56Sopenharmony_ciSequence.register(range) 10397db96d56Sopenharmony_ciSequence.register(memoryview) 10407db96d56Sopenharmony_ci 10417db96d56Sopenharmony_ci 10427db96d56Sopenharmony_ciclass ByteString(Sequence): 10437db96d56Sopenharmony_ci """This unifies bytes and bytearray. 10447db96d56Sopenharmony_ci 10457db96d56Sopenharmony_ci XXX Should add all their methods. 10467db96d56Sopenharmony_ci """ 10477db96d56Sopenharmony_ci 10487db96d56Sopenharmony_ci __slots__ = () 10497db96d56Sopenharmony_ci 10507db96d56Sopenharmony_ciByteString.register(bytes) 10517db96d56Sopenharmony_ciByteString.register(bytearray) 10527db96d56Sopenharmony_ci 10537db96d56Sopenharmony_ci 10547db96d56Sopenharmony_ciclass MutableSequence(Sequence): 10557db96d56Sopenharmony_ci """All the operations on a read-write sequence. 10567db96d56Sopenharmony_ci 10577db96d56Sopenharmony_ci Concrete subclasses must provide __new__ or __init__, 10587db96d56Sopenharmony_ci __getitem__, __setitem__, __delitem__, __len__, and insert(). 10597db96d56Sopenharmony_ci """ 10607db96d56Sopenharmony_ci 10617db96d56Sopenharmony_ci __slots__ = () 10627db96d56Sopenharmony_ci 10637db96d56Sopenharmony_ci @abstractmethod 10647db96d56Sopenharmony_ci def __setitem__(self, index, value): 10657db96d56Sopenharmony_ci raise IndexError 10667db96d56Sopenharmony_ci 10677db96d56Sopenharmony_ci @abstractmethod 10687db96d56Sopenharmony_ci def __delitem__(self, index): 10697db96d56Sopenharmony_ci raise IndexError 10707db96d56Sopenharmony_ci 10717db96d56Sopenharmony_ci @abstractmethod 10727db96d56Sopenharmony_ci def insert(self, index, value): 10737db96d56Sopenharmony_ci 'S.insert(index, value) -- insert value before index' 10747db96d56Sopenharmony_ci raise IndexError 10757db96d56Sopenharmony_ci 10767db96d56Sopenharmony_ci def append(self, value): 10777db96d56Sopenharmony_ci 'S.append(value) -- append value to the end of the sequence' 10787db96d56Sopenharmony_ci self.insert(len(self), value) 10797db96d56Sopenharmony_ci 10807db96d56Sopenharmony_ci def clear(self): 10817db96d56Sopenharmony_ci 'S.clear() -> None -- remove all items from S' 10827db96d56Sopenharmony_ci try: 10837db96d56Sopenharmony_ci while True: 10847db96d56Sopenharmony_ci self.pop() 10857db96d56Sopenharmony_ci except IndexError: 10867db96d56Sopenharmony_ci pass 10877db96d56Sopenharmony_ci 10887db96d56Sopenharmony_ci def reverse(self): 10897db96d56Sopenharmony_ci 'S.reverse() -- reverse *IN PLACE*' 10907db96d56Sopenharmony_ci n = len(self) 10917db96d56Sopenharmony_ci for i in range(n//2): 10927db96d56Sopenharmony_ci self[i], self[n-i-1] = self[n-i-1], self[i] 10937db96d56Sopenharmony_ci 10947db96d56Sopenharmony_ci def extend(self, values): 10957db96d56Sopenharmony_ci 'S.extend(iterable) -- extend sequence by appending elements from the iterable' 10967db96d56Sopenharmony_ci if values is self: 10977db96d56Sopenharmony_ci values = list(values) 10987db96d56Sopenharmony_ci for v in values: 10997db96d56Sopenharmony_ci self.append(v) 11007db96d56Sopenharmony_ci 11017db96d56Sopenharmony_ci def pop(self, index=-1): 11027db96d56Sopenharmony_ci '''S.pop([index]) -> item -- remove and return item at index (default last). 11037db96d56Sopenharmony_ci Raise IndexError if list is empty or index is out of range. 11047db96d56Sopenharmony_ci ''' 11057db96d56Sopenharmony_ci v = self[index] 11067db96d56Sopenharmony_ci del self[index] 11077db96d56Sopenharmony_ci return v 11087db96d56Sopenharmony_ci 11097db96d56Sopenharmony_ci def remove(self, value): 11107db96d56Sopenharmony_ci '''S.remove(value) -- remove first occurrence of value. 11117db96d56Sopenharmony_ci Raise ValueError if the value is not present. 11127db96d56Sopenharmony_ci ''' 11137db96d56Sopenharmony_ci del self[self.index(value)] 11147db96d56Sopenharmony_ci 11157db96d56Sopenharmony_ci def __iadd__(self, values): 11167db96d56Sopenharmony_ci self.extend(values) 11177db96d56Sopenharmony_ci return self 11187db96d56Sopenharmony_ci 11197db96d56Sopenharmony_ci 11207db96d56Sopenharmony_ciMutableSequence.register(list) 11217db96d56Sopenharmony_ciMutableSequence.register(bytearray) # Multiply inheriting, see ByteString 1122