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