1cd16bf640405065e4702539632ce577536207d88Guido van Rossum# Copyright 2007 Google, Inc. All Rights Reserved. 2cd16bf640405065e4702539632ce577536207d88Guido van Rossum# Licensed to PSF under a Contributor Agreement. 3cd16bf640405065e4702539632ce577536207d88Guido van Rossum 4cd16bf640405065e4702539632ce577536207d88Guido van Rossum"""Abstract Base Classes (ABCs) for collections, according to PEP 3119. 5cd16bf640405065e4702539632ce577536207d88Guido van Rossum 6158c9c26fca16dee2f7a8d89707cf9c149bd04f2Raymond HettingerUnit tests are in test_collections. 7cd16bf640405065e4702539632ce577536207d88Guido van Rossum""" 8cd16bf640405065e4702539632ce577536207d88Guido van Rossum 9cd16bf640405065e4702539632ce577536207d88Guido van Rossumfrom abc import ABCMeta, abstractmethod 104118174315f4cba03208886af868fe31f1cd5b9dBenjamin Petersonimport sys 11cd16bf640405065e4702539632ce577536207d88Guido van Rossum 1222214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov__all__ = ["Awaitable", "Coroutine", 1322214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov "AsyncIterable", "AsyncIterator", "AsyncGenerator", 1416ca06b8cb2426b540fdab75914d7cd0f715b7f0Guido van Rossum "Hashable", "Iterable", "Iterator", "Generator", "Reversible", 15f0666949fda1f418eb656b7503b4609e6bd58163Guido van Rossum "Sized", "Container", "Callable", "Collection", 16cd16bf640405065e4702539632ce577536207d88Guido van Rossum "Set", "MutableSet", 17cd16bf640405065e4702539632ce577536207d88Guido van Rossum "Mapping", "MutableMapping", 18cd16bf640405065e4702539632ce577536207d88Guido van Rossum "MappingView", "KeysView", "ItemsView", "ValuesView", 19cd16bf640405065e4702539632ce577536207d88Guido van Rossum "Sequence", "MutableSequence", 20d05eb0043e597cf2d5c429d0e554fd39364e36b0Guido van Rossum "ByteString", 21cd16bf640405065e4702539632ce577536207d88Guido van Rossum ] 22cd16bf640405065e4702539632ce577536207d88Guido van Rossum 23bf235bd212d0c420c7fd78dcb1baea69c48e6552Christian Heimes# This module has been renamed from collections.abc to _collections_abc to 24bf235bd212d0c420c7fd78dcb1baea69c48e6552Christian Heimes# speed up interpreter startup. Some of the types such as MutableMapping are 25bf235bd212d0c420c7fd78dcb1baea69c48e6552Christian Heimes# required early but collections module imports a lot of other modules. 26bf235bd212d0c420c7fd78dcb1baea69c48e6552Christian Heimes# See issue #19218 27bf235bd212d0c420c7fd78dcb1baea69c48e6552Christian Heimes__name__ = "collections.abc" 28bf235bd212d0c420c7fd78dcb1baea69c48e6552Christian Heimes 2902184282c7b6f68f905a08670b93862662bf4397Raymond Hettinger# Private list of types that we want to register with the various ABCs 3002184282c7b6f68f905a08670b93862662bf4397Raymond Hettinger# so that they will pass tests like: 3102184282c7b6f68f905a08670b93862662bf4397Raymond Hettinger# it = iter(somebytearray) 3202184282c7b6f68f905a08670b93862662bf4397Raymond Hettinger# assert isinstance(it, Iterable) 333bd9fde4dfa2e8c50ea10c48a819b1dddafb6dc4Serhiy Storchaka# Note: in other implementations, these types might not be distinct 343bd9fde4dfa2e8c50ea10c48a819b1dddafb6dc4Serhiy Storchaka# and they may have their own implementation specific types that 3502184282c7b6f68f905a08670b93862662bf4397Raymond Hettinger# are not included on this list. 36f83be4e3f353c4cfb53a22793dd1394797988c30Christian Heimesbytes_iterator = type(iter(b'')) 37f83be4e3f353c4cfb53a22793dd1394797988c30Christian Heimesbytearray_iterator = type(iter(bytearray())) 38f83be4e3f353c4cfb53a22793dd1394797988c30Christian Heimes#callable_iterator = ??? 39f83be4e3f353c4cfb53a22793dd1394797988c30Christian Heimesdict_keyiterator = type(iter({}.keys())) 40f83be4e3f353c4cfb53a22793dd1394797988c30Christian Heimesdict_valueiterator = type(iter({}.values())) 41f83be4e3f353c4cfb53a22793dd1394797988c30Christian Heimesdict_itemiterator = type(iter({}.items())) 42f83be4e3f353c4cfb53a22793dd1394797988c30Christian Heimeslist_iterator = type(iter([])) 43f83be4e3f353c4cfb53a22793dd1394797988c30Christian Heimeslist_reverseiterator = type(iter(reversed([]))) 44f83be4e3f353c4cfb53a22793dd1394797988c30Christian Heimesrange_iterator = type(iter(range(0))) 4548b1c3fcfc47b720a721ef887dd495ad667f567fSerhiy Storchakalongrange_iterator = type(iter(range(1 << 1000))) 46f83be4e3f353c4cfb53a22793dd1394797988c30Christian Heimesset_iterator = type(iter(set())) 47f83be4e3f353c4cfb53a22793dd1394797988c30Christian Heimesstr_iterator = type(iter("")) 48f83be4e3f353c4cfb53a22793dd1394797988c30Christian Heimestuple_iterator = type(iter(())) 49f83be4e3f353c4cfb53a22793dd1394797988c30Christian Heimeszip_iterator = type(iter(zip())) 50f83be4e3f353c4cfb53a22793dd1394797988c30Christian Heimes## views ## 51f83be4e3f353c4cfb53a22793dd1394797988c30Christian Heimesdict_keys = type({}.keys()) 52f83be4e3f353c4cfb53a22793dd1394797988c30Christian Heimesdict_values = type({}.values()) 53f83be4e3f353c4cfb53a22793dd1394797988c30Christian Heimesdict_items = type({}.items()) 540db38532b304c89a998e4fc53b3ac8cd7ff23a8aChristian Heimes## misc ## 557b17a4e117fa6ad9f0063aa2f039930f40d91820Victor Stinnermappingproxy = type(type.__dict__) 56bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettingergenerator = type((lambda: (yield))()) 575376ba9630e45ad177150ae68c9712640330a2fcYury Selivanov## coroutine ## 585376ba9630e45ad177150ae68c9712640330a2fcYury Selivanovasync def _coro(): pass 595376ba9630e45ad177150ae68c9712640330a2fcYury Selivanov_coro = _coro() 605376ba9630e45ad177150ae68c9712640330a2fcYury Selivanovcoroutine = type(_coro) 615376ba9630e45ad177150ae68c9712640330a2fcYury Selivanov_coro.close() # Prevent ResourceWarning 625376ba9630e45ad177150ae68c9712640330a2fcYury Selivanovdel _coro 6322214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov## asynchronous generator ## 6422214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanovasync def _ag(): yield 6522214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov_ag = _ag() 6622214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanovasync_generator = type(_ag) 6722214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanovdel _ag 68f83be4e3f353c4cfb53a22793dd1394797988c30Christian Heimes 69f83be4e3f353c4cfb53a22793dd1394797988c30Christian Heimes 70cd16bf640405065e4702539632ce577536207d88Guido van Rossum### ONE-TRICK PONIES ### 71cd16bf640405065e4702539632ce577536207d88Guido van Rossum 7297c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossumdef _check_methods(C, *methods): 7397c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum mro = C.__mro__ 7497c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum for method in methods: 7597c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum for B in mro: 7697c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum if method in B.__dict__: 7797c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum if B.__dict__[method] is None: 7897c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum return NotImplemented 7997c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum break 8097c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum else: 8197c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum return NotImplemented 8297c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum return True 8397c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum 84cd16bf640405065e4702539632ce577536207d88Guido van Rossumclass Hashable(metaclass=ABCMeta): 85cd16bf640405065e4702539632ce577536207d88Guido van Rossum 86c46759ad0b3419bb67b33f0358af5ae50dc0c5feRaymond Hettinger __slots__ = () 87c46759ad0b3419bb67b33f0358af5ae50dc0c5feRaymond Hettinger 88cd16bf640405065e4702539632ce577536207d88Guido van Rossum @abstractmethod 89cd16bf640405065e4702539632ce577536207d88Guido van Rossum def __hash__(self): 90cd16bf640405065e4702539632ce577536207d88Guido van Rossum return 0 91cd16bf640405065e4702539632ce577536207d88Guido van Rossum 92cd16bf640405065e4702539632ce577536207d88Guido van Rossum @classmethod 93cd16bf640405065e4702539632ce577536207d88Guido van Rossum def __subclasshook__(cls, C): 94cd16bf640405065e4702539632ce577536207d88Guido van Rossum if cls is Hashable: 9597c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum return _check_methods(C, "__hash__") 96cd16bf640405065e4702539632ce577536207d88Guido van Rossum return NotImplemented 97cd16bf640405065e4702539632ce577536207d88Guido van Rossum 98cd16bf640405065e4702539632ce577536207d88Guido van Rossum 99fdbeb2b4b67e1e44c96127a06cf1bdf878f4f7caYury Selivanovclass Awaitable(metaclass=ABCMeta): 10056fc61402533dc550244efe3e860242872f35badYury Selivanov 10156fc61402533dc550244efe3e860242872f35badYury Selivanov __slots__ = () 10256fc61402533dc550244efe3e860242872f35badYury Selivanov 10356fc61402533dc550244efe3e860242872f35badYury Selivanov @abstractmethod 10456fc61402533dc550244efe3e860242872f35badYury Selivanov def __await__(self): 10556fc61402533dc550244efe3e860242872f35badYury Selivanov yield 10656fc61402533dc550244efe3e860242872f35badYury Selivanov 10756fc61402533dc550244efe3e860242872f35badYury Selivanov @classmethod 10856fc61402533dc550244efe3e860242872f35badYury Selivanov def __subclasshook__(cls, C): 10956fc61402533dc550244efe3e860242872f35badYury Selivanov if cls is Awaitable: 11097c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum return _check_methods(C, "__await__") 11156fc61402533dc550244efe3e860242872f35badYury Selivanov return NotImplemented 11256fc61402533dc550244efe3e860242872f35badYury Selivanov 11356fc61402533dc550244efe3e860242872f35badYury Selivanov 11456fc61402533dc550244efe3e860242872f35badYury Selivanovclass Coroutine(Awaitable): 1157544508f0245173bff5866aa1598c8f6cce1fc5fYury Selivanov 1167544508f0245173bff5866aa1598c8f6cce1fc5fYury Selivanov __slots__ = () 1177544508f0245173bff5866aa1598c8f6cce1fc5fYury Selivanov 1187544508f0245173bff5866aa1598c8f6cce1fc5fYury Selivanov @abstractmethod 1197544508f0245173bff5866aa1598c8f6cce1fc5fYury Selivanov def send(self, value): 1207544508f0245173bff5866aa1598c8f6cce1fc5fYury Selivanov """Send a value into the coroutine. 1217544508f0245173bff5866aa1598c8f6cce1fc5fYury Selivanov Return next yielded value or raise StopIteration. 1227544508f0245173bff5866aa1598c8f6cce1fc5fYury Selivanov """ 1237544508f0245173bff5866aa1598c8f6cce1fc5fYury Selivanov raise StopIteration 1247544508f0245173bff5866aa1598c8f6cce1fc5fYury Selivanov 1257544508f0245173bff5866aa1598c8f6cce1fc5fYury Selivanov @abstractmethod 1267544508f0245173bff5866aa1598c8f6cce1fc5fYury Selivanov def throw(self, typ, val=None, tb=None): 1277544508f0245173bff5866aa1598c8f6cce1fc5fYury Selivanov """Raise an exception in the coroutine. 1287544508f0245173bff5866aa1598c8f6cce1fc5fYury Selivanov Return next yielded value or raise StopIteration. 1297544508f0245173bff5866aa1598c8f6cce1fc5fYury Selivanov """ 1307544508f0245173bff5866aa1598c8f6cce1fc5fYury Selivanov if val is None: 1317544508f0245173bff5866aa1598c8f6cce1fc5fYury Selivanov if tb is None: 1327544508f0245173bff5866aa1598c8f6cce1fc5fYury Selivanov raise typ 1337544508f0245173bff5866aa1598c8f6cce1fc5fYury Selivanov val = typ() 1347544508f0245173bff5866aa1598c8f6cce1fc5fYury Selivanov if tb is not None: 1357544508f0245173bff5866aa1598c8f6cce1fc5fYury Selivanov val = val.with_traceback(tb) 1367544508f0245173bff5866aa1598c8f6cce1fc5fYury Selivanov raise val 1377544508f0245173bff5866aa1598c8f6cce1fc5fYury Selivanov 1387544508f0245173bff5866aa1598c8f6cce1fc5fYury Selivanov def close(self): 1397544508f0245173bff5866aa1598c8f6cce1fc5fYury Selivanov """Raise GeneratorExit inside coroutine. 1407544508f0245173bff5866aa1598c8f6cce1fc5fYury Selivanov """ 1417544508f0245173bff5866aa1598c8f6cce1fc5fYury Selivanov try: 1427544508f0245173bff5866aa1598c8f6cce1fc5fYury Selivanov self.throw(GeneratorExit) 1437544508f0245173bff5866aa1598c8f6cce1fc5fYury Selivanov except (GeneratorExit, StopIteration): 1447544508f0245173bff5866aa1598c8f6cce1fc5fYury Selivanov pass 1457544508f0245173bff5866aa1598c8f6cce1fc5fYury Selivanov else: 1467544508f0245173bff5866aa1598c8f6cce1fc5fYury Selivanov raise RuntimeError("coroutine ignored GeneratorExit") 1477544508f0245173bff5866aa1598c8f6cce1fc5fYury Selivanov 1487544508f0245173bff5866aa1598c8f6cce1fc5fYury Selivanov @classmethod 1497544508f0245173bff5866aa1598c8f6cce1fc5fYury Selivanov def __subclasshook__(cls, C): 15056fc61402533dc550244efe3e860242872f35badYury Selivanov if cls is Coroutine: 15197c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum return _check_methods(C, '__await__', 'send', 'throw', 'close') 1527544508f0245173bff5866aa1598c8f6cce1fc5fYury Selivanov return NotImplemented 1537544508f0245173bff5866aa1598c8f6cce1fc5fYury Selivanov 1547544508f0245173bff5866aa1598c8f6cce1fc5fYury Selivanov 1555376ba9630e45ad177150ae68c9712640330a2fcYury SelivanovCoroutine.register(coroutine) 1565376ba9630e45ad177150ae68c9712640330a2fcYury Selivanov 1575376ba9630e45ad177150ae68c9712640330a2fcYury Selivanov 158e0104ae1034eff71539e487caaab35365f08f181Yury Selivanovclass AsyncIterable(metaclass=ABCMeta): 159e0104ae1034eff71539e487caaab35365f08f181Yury Selivanov 160e0104ae1034eff71539e487caaab35365f08f181Yury Selivanov __slots__ = () 161e0104ae1034eff71539e487caaab35365f08f181Yury Selivanov 162e0104ae1034eff71539e487caaab35365f08f181Yury Selivanov @abstractmethod 163a6f6edbda8648698289a8ee7abef6a35c924151bYury Selivanov def __aiter__(self): 164e0104ae1034eff71539e487caaab35365f08f181Yury Selivanov return AsyncIterator() 165e0104ae1034eff71539e487caaab35365f08f181Yury Selivanov 166e0104ae1034eff71539e487caaab35365f08f181Yury Selivanov @classmethod 167e0104ae1034eff71539e487caaab35365f08f181Yury Selivanov def __subclasshook__(cls, C): 168e0104ae1034eff71539e487caaab35365f08f181Yury Selivanov if cls is AsyncIterable: 16997c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum return _check_methods(C, "__aiter__") 170e0104ae1034eff71539e487caaab35365f08f181Yury Selivanov return NotImplemented 171e0104ae1034eff71539e487caaab35365f08f181Yury Selivanov 172e0104ae1034eff71539e487caaab35365f08f181Yury Selivanov 173e0104ae1034eff71539e487caaab35365f08f181Yury Selivanovclass AsyncIterator(AsyncIterable): 174e0104ae1034eff71539e487caaab35365f08f181Yury Selivanov 175e0104ae1034eff71539e487caaab35365f08f181Yury Selivanov __slots__ = () 176e0104ae1034eff71539e487caaab35365f08f181Yury Selivanov 177e0104ae1034eff71539e487caaab35365f08f181Yury Selivanov @abstractmethod 178e0104ae1034eff71539e487caaab35365f08f181Yury Selivanov async def __anext__(self): 179e0104ae1034eff71539e487caaab35365f08f181Yury Selivanov """Return the next item or raise StopAsyncIteration when exhausted.""" 180e0104ae1034eff71539e487caaab35365f08f181Yury Selivanov raise StopAsyncIteration 181e0104ae1034eff71539e487caaab35365f08f181Yury Selivanov 182a6f6edbda8648698289a8ee7abef6a35c924151bYury Selivanov def __aiter__(self): 183e0104ae1034eff71539e487caaab35365f08f181Yury Selivanov return self 184e0104ae1034eff71539e487caaab35365f08f181Yury Selivanov 185e0104ae1034eff71539e487caaab35365f08f181Yury Selivanov @classmethod 186e0104ae1034eff71539e487caaab35365f08f181Yury Selivanov def __subclasshook__(cls, C): 187e0104ae1034eff71539e487caaab35365f08f181Yury Selivanov if cls is AsyncIterator: 18897c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum return _check_methods(C, "__anext__", "__aiter__") 189e0104ae1034eff71539e487caaab35365f08f181Yury Selivanov return NotImplemented 190e0104ae1034eff71539e487caaab35365f08f181Yury Selivanov 191e0104ae1034eff71539e487caaab35365f08f181Yury Selivanov 19222214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanovclass AsyncGenerator(AsyncIterator): 19322214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov 19422214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov __slots__ = () 19522214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov 19622214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov async def __anext__(self): 19722214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov """Return the next item from the asynchronous generator. 19822214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov When exhausted, raise StopAsyncIteration. 19922214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov """ 20022214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov return await self.asend(None) 20122214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov 20222214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov @abstractmethod 20322214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov async def asend(self, value): 20422214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov """Send a value into the asynchronous generator. 20522214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov Return next yielded value or raise StopAsyncIteration. 20622214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov """ 20722214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov raise StopAsyncIteration 20822214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov 20922214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov @abstractmethod 21022214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov async def athrow(self, typ, val=None, tb=None): 21122214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov """Raise an exception in the asynchronous generator. 21222214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov Return next yielded value or raise StopAsyncIteration. 21322214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov """ 21422214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov if val is None: 21522214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov if tb is None: 21622214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov raise typ 21722214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov val = typ() 21822214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov if tb is not None: 21922214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov val = val.with_traceback(tb) 22022214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov raise val 22122214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov 22222214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov async def aclose(self): 22322214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov """Raise GeneratorExit inside coroutine. 22422214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov """ 22522214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov try: 22622214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov await self.athrow(GeneratorExit) 22722214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov except (GeneratorExit, StopAsyncIteration): 22822214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov pass 22922214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov else: 23022214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov raise RuntimeError("asynchronous generator ignored GeneratorExit") 23122214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov 23222214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov @classmethod 23322214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov def __subclasshook__(cls, C): 23422214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov if cls is AsyncGenerator: 23522214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov return _check_methods(C, '__aiter__', '__anext__', 23622214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov 'asend', 'athrow', 'aclose') 23722214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov return NotImplemented 23822214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov 23922214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov 24022214ab0af2cbea1611b2193354f248ca6b03e87Yury SelivanovAsyncGenerator.register(async_generator) 24122214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov 24222214ab0af2cbea1611b2193354f248ca6b03e87Yury Selivanov 243cd16bf640405065e4702539632ce577536207d88Guido van Rossumclass Iterable(metaclass=ABCMeta): 244cd16bf640405065e4702539632ce577536207d88Guido van Rossum 245c46759ad0b3419bb67b33f0358af5ae50dc0c5feRaymond Hettinger __slots__ = () 246c46759ad0b3419bb67b33f0358af5ae50dc0c5feRaymond Hettinger 247cd16bf640405065e4702539632ce577536207d88Guido van Rossum @abstractmethod 248cd16bf640405065e4702539632ce577536207d88Guido van Rossum def __iter__(self): 249cd16bf640405065e4702539632ce577536207d88Guido van Rossum while False: 250cd16bf640405065e4702539632ce577536207d88Guido van Rossum yield None 251cd16bf640405065e4702539632ce577536207d88Guido van Rossum 252cd16bf640405065e4702539632ce577536207d88Guido van Rossum @classmethod 253cd16bf640405065e4702539632ce577536207d88Guido van Rossum def __subclasshook__(cls, C): 254cd16bf640405065e4702539632ce577536207d88Guido van Rossum if cls is Iterable: 25597c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum return _check_methods(C, "__iter__") 256cd16bf640405065e4702539632ce577536207d88Guido van Rossum return NotImplemented 257cd16bf640405065e4702539632ce577536207d88Guido van Rossum 258cd16bf640405065e4702539632ce577536207d88Guido van Rossum 25974b6495b344303a84bf5e51ff388d8200dad4f64Raymond Hettingerclass Iterator(Iterable): 260cd16bf640405065e4702539632ce577536207d88Guido van Rossum 261c46759ad0b3419bb67b33f0358af5ae50dc0c5feRaymond Hettinger __slots__ = () 262c46759ad0b3419bb67b33f0358af5ae50dc0c5feRaymond Hettinger 263cd16bf640405065e4702539632ce577536207d88Guido van Rossum @abstractmethod 264cd16bf640405065e4702539632ce577536207d88Guido van Rossum def __next__(self): 265153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger 'Return the next item from the iterator. When exhausted, raise StopIteration' 266cd16bf640405065e4702539632ce577536207d88Guido van Rossum raise StopIteration 267cd16bf640405065e4702539632ce577536207d88Guido van Rossum 268cd16bf640405065e4702539632ce577536207d88Guido van Rossum def __iter__(self): 269cd16bf640405065e4702539632ce577536207d88Guido van Rossum return self 270cd16bf640405065e4702539632ce577536207d88Guido van Rossum 271cd16bf640405065e4702539632ce577536207d88Guido van Rossum @classmethod 272cd16bf640405065e4702539632ce577536207d88Guido van Rossum def __subclasshook__(cls, C): 273cd16bf640405065e4702539632ce577536207d88Guido van Rossum if cls is Iterator: 27497c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum return _check_methods(C, '__iter__', '__next__') 275cd16bf640405065e4702539632ce577536207d88Guido van Rossum return NotImplemented 276cd16bf640405065e4702539632ce577536207d88Guido van Rossum 277f83be4e3f353c4cfb53a22793dd1394797988c30Christian HeimesIterator.register(bytes_iterator) 278f83be4e3f353c4cfb53a22793dd1394797988c30Christian HeimesIterator.register(bytearray_iterator) 279f83be4e3f353c4cfb53a22793dd1394797988c30Christian Heimes#Iterator.register(callable_iterator) 280f83be4e3f353c4cfb53a22793dd1394797988c30Christian HeimesIterator.register(dict_keyiterator) 281f83be4e3f353c4cfb53a22793dd1394797988c30Christian HeimesIterator.register(dict_valueiterator) 282f83be4e3f353c4cfb53a22793dd1394797988c30Christian HeimesIterator.register(dict_itemiterator) 283f83be4e3f353c4cfb53a22793dd1394797988c30Christian HeimesIterator.register(list_iterator) 284f83be4e3f353c4cfb53a22793dd1394797988c30Christian HeimesIterator.register(list_reverseiterator) 285f83be4e3f353c4cfb53a22793dd1394797988c30Christian HeimesIterator.register(range_iterator) 28648b1c3fcfc47b720a721ef887dd495ad667f567fSerhiy StorchakaIterator.register(longrange_iterator) 287f83be4e3f353c4cfb53a22793dd1394797988c30Christian HeimesIterator.register(set_iterator) 288f83be4e3f353c4cfb53a22793dd1394797988c30Christian HeimesIterator.register(str_iterator) 289f83be4e3f353c4cfb53a22793dd1394797988c30Christian HeimesIterator.register(tuple_iterator) 290f83be4e3f353c4cfb53a22793dd1394797988c30Christian HeimesIterator.register(zip_iterator) 291cd16bf640405065e4702539632ce577536207d88Guido van Rossum 292bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger 29316ca06b8cb2426b540fdab75914d7cd0f715b7f0Guido van Rossumclass Reversible(Iterable): 29416ca06b8cb2426b540fdab75914d7cd0f715b7f0Guido van Rossum 29516ca06b8cb2426b540fdab75914d7cd0f715b7f0Guido van Rossum __slots__ = () 29616ca06b8cb2426b540fdab75914d7cd0f715b7f0Guido van Rossum 29716ca06b8cb2426b540fdab75914d7cd0f715b7f0Guido van Rossum @abstractmethod 29816ca06b8cb2426b540fdab75914d7cd0f715b7f0Guido van Rossum def __reversed__(self): 29997c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum while False: 30097c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum yield None 30116ca06b8cb2426b540fdab75914d7cd0f715b7f0Guido van Rossum 30216ca06b8cb2426b540fdab75914d7cd0f715b7f0Guido van Rossum @classmethod 30316ca06b8cb2426b540fdab75914d7cd0f715b7f0Guido van Rossum def __subclasshook__(cls, C): 30416ca06b8cb2426b540fdab75914d7cd0f715b7f0Guido van Rossum if cls is Reversible: 30597c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum return _check_methods(C, "__reversed__", "__iter__") 30616ca06b8cb2426b540fdab75914d7cd0f715b7f0Guido van Rossum return NotImplemented 30716ca06b8cb2426b540fdab75914d7cd0f715b7f0Guido van Rossum 30816ca06b8cb2426b540fdab75914d7cd0f715b7f0Guido van Rossum 309bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettingerclass Generator(Iterator): 310bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger 311bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger __slots__ = () 312bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger 313bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger def __next__(self): 314bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger """Return the next item from the generator. 315bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger When exhausted, raise StopIteration. 316bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger """ 317bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger return self.send(None) 318bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger 319bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger @abstractmethod 320bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger def send(self, value): 321bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger """Send a value into the generator. 322bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger Return next yielded value or raise StopIteration. 323bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger """ 324bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger raise StopIteration 325bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger 326bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger @abstractmethod 327bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger def throw(self, typ, val=None, tb=None): 328bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger """Raise an exception in the generator. 329bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger Return next yielded value or raise StopIteration. 330bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger """ 331bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger if val is None: 332bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger if tb is None: 333bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger raise typ 334bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger val = typ() 335bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger if tb is not None: 336bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger val = val.with_traceback(tb) 337bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger raise val 338bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger 339bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger def close(self): 340bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger """Raise GeneratorExit inside generator. 341bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger """ 342bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger try: 343bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger self.throw(GeneratorExit) 344bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger except (GeneratorExit, StopIteration): 345bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger pass 346bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger else: 347bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger raise RuntimeError("generator ignored GeneratorExit") 348bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger 349bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger @classmethod 350bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger def __subclasshook__(cls, C): 351bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger if cls is Generator: 35297c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum return _check_methods(C, '__iter__', '__next__', 35397c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum 'send', 'throw', 'close') 354bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger return NotImplemented 355bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger 356bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond HettingerGenerator.register(generator) 357bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger 358bd60e8dece89440ebdc80a19b2217d5ba2515124Raymond Hettinger 359cd16bf640405065e4702539632ce577536207d88Guido van Rossumclass Sized(metaclass=ABCMeta): 360cd16bf640405065e4702539632ce577536207d88Guido van Rossum 361c46759ad0b3419bb67b33f0358af5ae50dc0c5feRaymond Hettinger __slots__ = () 362c46759ad0b3419bb67b33f0358af5ae50dc0c5feRaymond Hettinger 363cd16bf640405065e4702539632ce577536207d88Guido van Rossum @abstractmethod 364cd16bf640405065e4702539632ce577536207d88Guido van Rossum def __len__(self): 365cd16bf640405065e4702539632ce577536207d88Guido van Rossum return 0 366cd16bf640405065e4702539632ce577536207d88Guido van Rossum 367cd16bf640405065e4702539632ce577536207d88Guido van Rossum @classmethod 368cd16bf640405065e4702539632ce577536207d88Guido van Rossum def __subclasshook__(cls, C): 369cd16bf640405065e4702539632ce577536207d88Guido van Rossum if cls is Sized: 37097c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum return _check_methods(C, "__len__") 371cd16bf640405065e4702539632ce577536207d88Guido van Rossum return NotImplemented 372cd16bf640405065e4702539632ce577536207d88Guido van Rossum 373cd16bf640405065e4702539632ce577536207d88Guido van Rossum 374cd16bf640405065e4702539632ce577536207d88Guido van Rossumclass Container(metaclass=ABCMeta): 375cd16bf640405065e4702539632ce577536207d88Guido van Rossum 376c46759ad0b3419bb67b33f0358af5ae50dc0c5feRaymond Hettinger __slots__ = () 377c46759ad0b3419bb67b33f0358af5ae50dc0c5feRaymond Hettinger 378cd16bf640405065e4702539632ce577536207d88Guido van Rossum @abstractmethod 379cd16bf640405065e4702539632ce577536207d88Guido van Rossum def __contains__(self, x): 380cd16bf640405065e4702539632ce577536207d88Guido van Rossum return False 381cd16bf640405065e4702539632ce577536207d88Guido van Rossum 382cd16bf640405065e4702539632ce577536207d88Guido van Rossum @classmethod 383cd16bf640405065e4702539632ce577536207d88Guido van Rossum def __subclasshook__(cls, C): 384cd16bf640405065e4702539632ce577536207d88Guido van Rossum if cls is Container: 38597c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum return _check_methods(C, "__contains__") 386cd16bf640405065e4702539632ce577536207d88Guido van Rossum return NotImplemented 387cd16bf640405065e4702539632ce577536207d88Guido van Rossum 388f0666949fda1f418eb656b7503b4609e6bd58163Guido van Rossumclass Collection(Sized, Iterable, Container): 389f0666949fda1f418eb656b7503b4609e6bd58163Guido van Rossum 390f0666949fda1f418eb656b7503b4609e6bd58163Guido van Rossum __slots__ = () 391f0666949fda1f418eb656b7503b4609e6bd58163Guido van Rossum 392f0666949fda1f418eb656b7503b4609e6bd58163Guido van Rossum @classmethod 393f0666949fda1f418eb656b7503b4609e6bd58163Guido van Rossum def __subclasshook__(cls, C): 394f0666949fda1f418eb656b7503b4609e6bd58163Guido van Rossum if cls is Collection: 395f0666949fda1f418eb656b7503b4609e6bd58163Guido van Rossum return _check_methods(C, "__len__", "__iter__", "__contains__") 396f0666949fda1f418eb656b7503b4609e6bd58163Guido van Rossum return NotImplemented 397cd16bf640405065e4702539632ce577536207d88Guido van Rossum 398cd16bf640405065e4702539632ce577536207d88Guido van Rossumclass Callable(metaclass=ABCMeta): 399cd16bf640405065e4702539632ce577536207d88Guido van Rossum 400c46759ad0b3419bb67b33f0358af5ae50dc0c5feRaymond Hettinger __slots__ = () 401c46759ad0b3419bb67b33f0358af5ae50dc0c5feRaymond Hettinger 402cd16bf640405065e4702539632ce577536207d88Guido van Rossum @abstractmethod 4037864476afa402a0537c33ba9630e77351720baf8Christian Heimes def __call__(self, *args, **kwds): 404cd16bf640405065e4702539632ce577536207d88Guido van Rossum return False 405cd16bf640405065e4702539632ce577536207d88Guido van Rossum 406cd16bf640405065e4702539632ce577536207d88Guido van Rossum @classmethod 407cd16bf640405065e4702539632ce577536207d88Guido van Rossum def __subclasshook__(cls, C): 408cd16bf640405065e4702539632ce577536207d88Guido van Rossum if cls is Callable: 40997c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum return _check_methods(C, "__call__") 410cd16bf640405065e4702539632ce577536207d88Guido van Rossum return NotImplemented 411cd16bf640405065e4702539632ce577536207d88Guido van Rossum 412cd16bf640405065e4702539632ce577536207d88Guido van Rossum 413cd16bf640405065e4702539632ce577536207d88Guido van Rossum### SETS ### 414cd16bf640405065e4702539632ce577536207d88Guido van Rossum 415cd16bf640405065e4702539632ce577536207d88Guido van Rossum 416f0666949fda1f418eb656b7503b4609e6bd58163Guido van Rossumclass Set(Collection): 417cd16bf640405065e4702539632ce577536207d88Guido van Rossum 418cd16bf640405065e4702539632ce577536207d88Guido van Rossum """A set is a finite, iterable container. 419cd16bf640405065e4702539632ce577536207d88Guido van Rossum 420cd16bf640405065e4702539632ce577536207d88Guido van Rossum This class provides concrete generic implementations of all 421cd16bf640405065e4702539632ce577536207d88Guido van Rossum methods except for __contains__, __iter__ and __len__. 422cd16bf640405065e4702539632ce577536207d88Guido van Rossum 423cd16bf640405065e4702539632ce577536207d88Guido van Rossum To override the comparisons (presumably for speed, as the 42411cda4766108c3220402c5a430573a1288a1b4acRaymond Hettinger semantics are fixed), redefine __le__ and __ge__, 425cd16bf640405065e4702539632ce577536207d88Guido van Rossum then the other operations will automatically follow suit. 426cd16bf640405065e4702539632ce577536207d88Guido van Rossum """ 427cd16bf640405065e4702539632ce577536207d88Guido van Rossum 428c46759ad0b3419bb67b33f0358af5ae50dc0c5feRaymond Hettinger __slots__ = () 429c46759ad0b3419bb67b33f0358af5ae50dc0c5feRaymond Hettinger 430cd16bf640405065e4702539632ce577536207d88Guido van Rossum def __le__(self, other): 431cd16bf640405065e4702539632ce577536207d88Guido van Rossum if not isinstance(other, Set): 432cd16bf640405065e4702539632ce577536207d88Guido van Rossum return NotImplemented 433cd16bf640405065e4702539632ce577536207d88Guido van Rossum if len(self) > len(other): 434cd16bf640405065e4702539632ce577536207d88Guido van Rossum return False 435cd16bf640405065e4702539632ce577536207d88Guido van Rossum for elem in self: 436cd16bf640405065e4702539632ce577536207d88Guido van Rossum if elem not in other: 437cd16bf640405065e4702539632ce577536207d88Guido van Rossum return False 438cd16bf640405065e4702539632ce577536207d88Guido van Rossum return True 439cd16bf640405065e4702539632ce577536207d88Guido van Rossum 440cd16bf640405065e4702539632ce577536207d88Guido van Rossum def __lt__(self, other): 441cd16bf640405065e4702539632ce577536207d88Guido van Rossum if not isinstance(other, Set): 442cd16bf640405065e4702539632ce577536207d88Guido van Rossum return NotImplemented 443cd16bf640405065e4702539632ce577536207d88Guido van Rossum return len(self) < len(other) and self.__le__(other) 444cd16bf640405065e4702539632ce577536207d88Guido van Rossum 44571909423fd92862b869d8019d5e10c29bf946cb0Raymond Hettinger def __gt__(self, other): 44671909423fd92862b869d8019d5e10c29bf946cb0Raymond Hettinger if not isinstance(other, Set): 44771909423fd92862b869d8019d5e10c29bf946cb0Raymond Hettinger return NotImplemented 448dd5e53a086fcabc84ee1ac96b98057437863973aRaymond Hettinger return len(self) > len(other) and self.__ge__(other) 44971909423fd92862b869d8019d5e10c29bf946cb0Raymond Hettinger 45071909423fd92862b869d8019d5e10c29bf946cb0Raymond Hettinger def __ge__(self, other): 45171909423fd92862b869d8019d5e10c29bf946cb0Raymond Hettinger if not isinstance(other, Set): 45271909423fd92862b869d8019d5e10c29bf946cb0Raymond Hettinger return NotImplemented 453dd5e53a086fcabc84ee1ac96b98057437863973aRaymond Hettinger if len(self) < len(other): 454dd5e53a086fcabc84ee1ac96b98057437863973aRaymond Hettinger return False 455dd5e53a086fcabc84ee1ac96b98057437863973aRaymond Hettinger for elem in other: 456dd5e53a086fcabc84ee1ac96b98057437863973aRaymond Hettinger if elem not in self: 457dd5e53a086fcabc84ee1ac96b98057437863973aRaymond Hettinger return False 458dd5e53a086fcabc84ee1ac96b98057437863973aRaymond Hettinger return True 45971909423fd92862b869d8019d5e10c29bf946cb0Raymond Hettinger 460cd16bf640405065e4702539632ce577536207d88Guido van Rossum def __eq__(self, other): 461cd16bf640405065e4702539632ce577536207d88Guido van Rossum if not isinstance(other, Set): 462cd16bf640405065e4702539632ce577536207d88Guido van Rossum return NotImplemented 463cd16bf640405065e4702539632ce577536207d88Guido van Rossum return len(self) == len(other) and self.__le__(other) 464cd16bf640405065e4702539632ce577536207d88Guido van Rossum 465cd16bf640405065e4702539632ce577536207d88Guido van Rossum @classmethod 466cd16bf640405065e4702539632ce577536207d88Guido van Rossum def _from_iterable(cls, it): 4678284c4a7fb27efd55323513572e247a895a35ae1Raymond Hettinger '''Construct an instance of the class from any iterable input. 4688284c4a7fb27efd55323513572e247a895a35ae1Raymond Hettinger 4698284c4a7fb27efd55323513572e247a895a35ae1Raymond Hettinger Must override this method if the class constructor signature 4707aebb64bab2ef75c6d9ae55da9ae7049f05c8670Raymond Hettinger does not accept an iterable for an input. 4718284c4a7fb27efd55323513572e247a895a35ae1Raymond Hettinger ''' 4727aebb64bab2ef75c6d9ae55da9ae7049f05c8670Raymond Hettinger return cls(it) 473cd16bf640405065e4702539632ce577536207d88Guido van Rossum 474cd16bf640405065e4702539632ce577536207d88Guido van Rossum def __and__(self, other): 475cd16bf640405065e4702539632ce577536207d88Guido van Rossum if not isinstance(other, Iterable): 476cd16bf640405065e4702539632ce577536207d88Guido van Rossum return NotImplemented 477cd16bf640405065e4702539632ce577536207d88Guido van Rossum return self._from_iterable(value for value in other if value in self) 478cd16bf640405065e4702539632ce577536207d88Guido van Rossum 479dd5e53a086fcabc84ee1ac96b98057437863973aRaymond Hettinger __rand__ = __and__ 480dd5e53a086fcabc84ee1ac96b98057437863973aRaymond Hettinger 481190d79e5c648174b550de2bef75d1b4addf0d625Christian Heimes def isdisjoint(self, other): 482153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger 'Return True if two sets have a null intersection.' 483190d79e5c648174b550de2bef75d1b4addf0d625Christian Heimes for value in other: 484190d79e5c648174b550de2bef75d1b4addf0d625Christian Heimes if value in self: 485190d79e5c648174b550de2bef75d1b4addf0d625Christian Heimes return False 486190d79e5c648174b550de2bef75d1b4addf0d625Christian Heimes return True 487190d79e5c648174b550de2bef75d1b4addf0d625Christian Heimes 488cd16bf640405065e4702539632ce577536207d88Guido van Rossum def __or__(self, other): 489cd16bf640405065e4702539632ce577536207d88Guido van Rossum if not isinstance(other, Iterable): 490cd16bf640405065e4702539632ce577536207d88Guido van Rossum return NotImplemented 4917864476afa402a0537c33ba9630e77351720baf8Christian Heimes chain = (e for s in (self, other) for e in s) 4927864476afa402a0537c33ba9630e77351720baf8Christian Heimes return self._from_iterable(chain) 493cd16bf640405065e4702539632ce577536207d88Guido van Rossum 494dd5e53a086fcabc84ee1ac96b98057437863973aRaymond Hettinger __ror__ = __or__ 495dd5e53a086fcabc84ee1ac96b98057437863973aRaymond Hettinger 496cd16bf640405065e4702539632ce577536207d88Guido van Rossum def __sub__(self, other): 497cd16bf640405065e4702539632ce577536207d88Guido van Rossum if not isinstance(other, Set): 498cd16bf640405065e4702539632ce577536207d88Guido van Rossum if not isinstance(other, Iterable): 499cd16bf640405065e4702539632ce577536207d88Guido van Rossum return NotImplemented 500cd16bf640405065e4702539632ce577536207d88Guido van Rossum other = self._from_iterable(other) 501cd16bf640405065e4702539632ce577536207d88Guido van Rossum return self._from_iterable(value for value in self 502cd16bf640405065e4702539632ce577536207d88Guido van Rossum if value not in other) 503cd16bf640405065e4702539632ce577536207d88Guido van Rossum 504dd5e53a086fcabc84ee1ac96b98057437863973aRaymond Hettinger def __rsub__(self, other): 505dd5e53a086fcabc84ee1ac96b98057437863973aRaymond Hettinger if not isinstance(other, Set): 506dd5e53a086fcabc84ee1ac96b98057437863973aRaymond Hettinger if not isinstance(other, Iterable): 507dd5e53a086fcabc84ee1ac96b98057437863973aRaymond Hettinger return NotImplemented 508dd5e53a086fcabc84ee1ac96b98057437863973aRaymond Hettinger other = self._from_iterable(other) 509dd5e53a086fcabc84ee1ac96b98057437863973aRaymond Hettinger return self._from_iterable(value for value in other 510dd5e53a086fcabc84ee1ac96b98057437863973aRaymond Hettinger if value not in self) 511dd5e53a086fcabc84ee1ac96b98057437863973aRaymond Hettinger 512cd16bf640405065e4702539632ce577536207d88Guido van Rossum def __xor__(self, other): 513cd16bf640405065e4702539632ce577536207d88Guido van Rossum if not isinstance(other, Set): 514cd16bf640405065e4702539632ce577536207d88Guido van Rossum if not isinstance(other, Iterable): 515cd16bf640405065e4702539632ce577536207d88Guido van Rossum return NotImplemented 516cd16bf640405065e4702539632ce577536207d88Guido van Rossum other = self._from_iterable(other) 517cd16bf640405065e4702539632ce577536207d88Guido van Rossum return (self - other) | (other - self) 518cd16bf640405065e4702539632ce577536207d88Guido van Rossum 519dd5e53a086fcabc84ee1ac96b98057437863973aRaymond Hettinger __rxor__ = __xor__ 520dd5e53a086fcabc84ee1ac96b98057437863973aRaymond Hettinger 521cd16bf640405065e4702539632ce577536207d88Guido van Rossum def _hash(self): 522cd16bf640405065e4702539632ce577536207d88Guido van Rossum """Compute the hash value of a set. 523cd16bf640405065e4702539632ce577536207d88Guido van Rossum 524cd16bf640405065e4702539632ce577536207d88Guido van Rossum Note that we don't define __hash__: not all sets are hashable. 525cd16bf640405065e4702539632ce577536207d88Guido van Rossum But if you define a hashable set type, its __hash__ should 526cd16bf640405065e4702539632ce577536207d88Guido van Rossum call this function. 527cd16bf640405065e4702539632ce577536207d88Guido van Rossum 528cd16bf640405065e4702539632ce577536207d88Guido van Rossum This must be compatible __eq__. 529cd16bf640405065e4702539632ce577536207d88Guido van Rossum 530cd16bf640405065e4702539632ce577536207d88Guido van Rossum All sets ought to compare equal if they contain the same 531cd16bf640405065e4702539632ce577536207d88Guido van Rossum elements, regardless of how they are implemented, and 532cd16bf640405065e4702539632ce577536207d88Guido van Rossum regardless of the order of the elements; so there's not much 533cd16bf640405065e4702539632ce577536207d88Guido van Rossum freedom for __eq__ or __hash__. We match the algorithm used 534cd16bf640405065e4702539632ce577536207d88Guido van Rossum by the built-in frozenset type. 535cd16bf640405065e4702539632ce577536207d88Guido van Rossum """ 536a37d4c693a024154093b36a612810c3bd72d9254Christian Heimes MAX = sys.maxsize 537cd16bf640405065e4702539632ce577536207d88Guido van Rossum MASK = 2 * MAX + 1 538cd16bf640405065e4702539632ce577536207d88Guido van Rossum n = len(self) 539cd16bf640405065e4702539632ce577536207d88Guido van Rossum h = 1927868237 * (n + 1) 540cd16bf640405065e4702539632ce577536207d88Guido van Rossum h &= MASK 541cd16bf640405065e4702539632ce577536207d88Guido van Rossum for x in self: 542cd16bf640405065e4702539632ce577536207d88Guido van Rossum hx = hash(x) 543cd16bf640405065e4702539632ce577536207d88Guido van Rossum h ^= (hx ^ (hx << 16) ^ 89869747) * 3644798167 544cd16bf640405065e4702539632ce577536207d88Guido van Rossum h &= MASK 545cd16bf640405065e4702539632ce577536207d88Guido van Rossum h = h * 69069 + 907133923 546cd16bf640405065e4702539632ce577536207d88Guido van Rossum h &= MASK 547cd16bf640405065e4702539632ce577536207d88Guido van Rossum if h > MAX: 548cd16bf640405065e4702539632ce577536207d88Guido van Rossum h -= MASK + 1 549cd16bf640405065e4702539632ce577536207d88Guido van Rossum if h == -1: 550cd16bf640405065e4702539632ce577536207d88Guido van Rossum h = 590923713 551cd16bf640405065e4702539632ce577536207d88Guido van Rossum return h 552cd16bf640405065e4702539632ce577536207d88Guido van Rossum 553cd16bf640405065e4702539632ce577536207d88Guido van RossumSet.register(frozenset) 554cd16bf640405065e4702539632ce577536207d88Guido van Rossum 555cd16bf640405065e4702539632ce577536207d88Guido van Rossum 556cd16bf640405065e4702539632ce577536207d88Guido van Rossumclass MutableSet(Set): 557153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger """A mutable set is a finite, iterable container. 558153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger 559153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger This class provides concrete generic implementations of all 560153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger methods except for __contains__, __iter__, __len__, 561153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger add(), and discard(). 562153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger 563153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger To override the comparisons (presumably for speed, as the 564153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger semantics are fixed), all you have to do is redefine __le__ and 565153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger then the other operations will automatically follow suit. 566153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger """ 567cd16bf640405065e4702539632ce577536207d88Guido van Rossum 568c46759ad0b3419bb67b33f0358af5ae50dc0c5feRaymond Hettinger __slots__ = () 569c46759ad0b3419bb67b33f0358af5ae50dc0c5feRaymond Hettinger 570cd16bf640405065e4702539632ce577536207d88Guido van Rossum @abstractmethod 571cd16bf640405065e4702539632ce577536207d88Guido van Rossum def add(self, value): 572058e31ef2aec3ea079cdf297fc0d4f40d3d9975aBenjamin Peterson """Add an element.""" 573cd16bf640405065e4702539632ce577536207d88Guido van Rossum raise NotImplementedError 574cd16bf640405065e4702539632ce577536207d88Guido van Rossum 575cd16bf640405065e4702539632ce577536207d88Guido van Rossum @abstractmethod 576cd16bf640405065e4702539632ce577536207d88Guido van Rossum def discard(self, value): 577058e31ef2aec3ea079cdf297fc0d4f40d3d9975aBenjamin Peterson """Remove an element. Do not raise an exception if absent.""" 578cd16bf640405065e4702539632ce577536207d88Guido van Rossum raise NotImplementedError 579cd16bf640405065e4702539632ce577536207d88Guido van Rossum 580190d79e5c648174b550de2bef75d1b4addf0d625Christian Heimes def remove(self, value): 581190d79e5c648174b550de2bef75d1b4addf0d625Christian Heimes """Remove an element. If not a member, raise a KeyError.""" 582190d79e5c648174b550de2bef75d1b4addf0d625Christian Heimes if value not in self: 583190d79e5c648174b550de2bef75d1b4addf0d625Christian Heimes raise KeyError(value) 584190d79e5c648174b550de2bef75d1b4addf0d625Christian Heimes self.discard(value) 585190d79e5c648174b550de2bef75d1b4addf0d625Christian Heimes 586cd16bf640405065e4702539632ce577536207d88Guido van Rossum def pop(self): 587cd16bf640405065e4702539632ce577536207d88Guido van Rossum """Return the popped value. Raise KeyError if empty.""" 588cd16bf640405065e4702539632ce577536207d88Guido van Rossum it = iter(self) 589cd16bf640405065e4702539632ce577536207d88Guido van Rossum try: 590ae650181b89feeb1f68fb7643d190df52d13bd9eRaymond Hettinger value = next(it) 591cd16bf640405065e4702539632ce577536207d88Guido van Rossum except StopIteration: 592cd16bf640405065e4702539632ce577536207d88Guido van Rossum raise KeyError 593cd16bf640405065e4702539632ce577536207d88Guido van Rossum self.discard(value) 594cd16bf640405065e4702539632ce577536207d88Guido van Rossum return value 595cd16bf640405065e4702539632ce577536207d88Guido van Rossum 596cd16bf640405065e4702539632ce577536207d88Guido van Rossum def clear(self): 597cd16bf640405065e4702539632ce577536207d88Guido van Rossum """This is slow (creates N new iterators!) but effective.""" 598cd16bf640405065e4702539632ce577536207d88Guido van Rossum try: 599cd16bf640405065e4702539632ce577536207d88Guido van Rossum while True: 600cd16bf640405065e4702539632ce577536207d88Guido van Rossum self.pop() 601cd16bf640405065e4702539632ce577536207d88Guido van Rossum except KeyError: 602cd16bf640405065e4702539632ce577536207d88Guido van Rossum pass 603cd16bf640405065e4702539632ce577536207d88Guido van Rossum 604b3d89a4ee438ee6927bfe553694b5b06f5672274Raymond Hettinger def __ior__(self, it): 605cd16bf640405065e4702539632ce577536207d88Guido van Rossum for value in it: 606cd16bf640405065e4702539632ce577536207d88Guido van Rossum self.add(value) 607cd16bf640405065e4702539632ce577536207d88Guido van Rossum return self 608cd16bf640405065e4702539632ce577536207d88Guido van Rossum 609b3d89a4ee438ee6927bfe553694b5b06f5672274Raymond Hettinger def __iand__(self, it): 6103f10a952f6056b6797e4187bcfa1a97c21d1b3bbRaymond Hettinger for value in (self - it): 6113f10a952f6056b6797e4187bcfa1a97c21d1b3bbRaymond Hettinger self.discard(value) 612cd16bf640405065e4702539632ce577536207d88Guido van Rossum return self 613cd16bf640405065e4702539632ce577536207d88Guido van Rossum 614b3d89a4ee438ee6927bfe553694b5b06f5672274Raymond Hettinger def __ixor__(self, it): 61531da5b2f69d408ac2448eb04ee2892b8aa3aac79Daniel Stutzbach if it is self: 61631da5b2f69d408ac2448eb04ee2892b8aa3aac79Daniel Stutzbach self.clear() 61731da5b2f69d408ac2448eb04ee2892b8aa3aac79Daniel Stutzbach else: 61831da5b2f69d408ac2448eb04ee2892b8aa3aac79Daniel Stutzbach if not isinstance(it, Set): 61931da5b2f69d408ac2448eb04ee2892b8aa3aac79Daniel Stutzbach it = self._from_iterable(it) 62031da5b2f69d408ac2448eb04ee2892b8aa3aac79Daniel Stutzbach for value in it: 62131da5b2f69d408ac2448eb04ee2892b8aa3aac79Daniel Stutzbach if value in self: 62231da5b2f69d408ac2448eb04ee2892b8aa3aac79Daniel Stutzbach self.discard(value) 62331da5b2f69d408ac2448eb04ee2892b8aa3aac79Daniel Stutzbach else: 62431da5b2f69d408ac2448eb04ee2892b8aa3aac79Daniel Stutzbach self.add(value) 625cd16bf640405065e4702539632ce577536207d88Guido van Rossum return self 626cd16bf640405065e4702539632ce577536207d88Guido van Rossum 627b3d89a4ee438ee6927bfe553694b5b06f5672274Raymond Hettinger def __isub__(self, it): 62831da5b2f69d408ac2448eb04ee2892b8aa3aac79Daniel Stutzbach if it is self: 62931da5b2f69d408ac2448eb04ee2892b8aa3aac79Daniel Stutzbach self.clear() 63031da5b2f69d408ac2448eb04ee2892b8aa3aac79Daniel Stutzbach else: 63131da5b2f69d408ac2448eb04ee2892b8aa3aac79Daniel Stutzbach for value in it: 63231da5b2f69d408ac2448eb04ee2892b8aa3aac79Daniel Stutzbach self.discard(value) 633cd16bf640405065e4702539632ce577536207d88Guido van Rossum return self 634cd16bf640405065e4702539632ce577536207d88Guido van Rossum 635cd16bf640405065e4702539632ce577536207d88Guido van RossumMutableSet.register(set) 636cd16bf640405065e4702539632ce577536207d88Guido van Rossum 637cd16bf640405065e4702539632ce577536207d88Guido van Rossum 638cd16bf640405065e4702539632ce577536207d88Guido van Rossum### MAPPINGS ### 639cd16bf640405065e4702539632ce577536207d88Guido van Rossum 640cd16bf640405065e4702539632ce577536207d88Guido van Rossum 641f0666949fda1f418eb656b7503b4609e6bd58163Guido van Rossumclass Mapping(Collection): 642cd16bf640405065e4702539632ce577536207d88Guido van Rossum 643c46759ad0b3419bb67b33f0358af5ae50dc0c5feRaymond Hettinger __slots__ = () 644c46759ad0b3419bb67b33f0358af5ae50dc0c5feRaymond Hettinger 645153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger """A Mapping is a generic container for associating key/value 646153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger pairs. 647153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger 648153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger This class provides concrete generic implementations of all 649153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger methods except for __getitem__, __iter__, and __len__. 650153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger 651153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger """ 652153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger 653cd16bf640405065e4702539632ce577536207d88Guido van Rossum @abstractmethod 654cd16bf640405065e4702539632ce577536207d88Guido van Rossum def __getitem__(self, key): 655cd16bf640405065e4702539632ce577536207d88Guido van Rossum raise KeyError 656cd16bf640405065e4702539632ce577536207d88Guido van Rossum 657cd16bf640405065e4702539632ce577536207d88Guido van Rossum def get(self, key, default=None): 658153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger 'D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.' 659cd16bf640405065e4702539632ce577536207d88Guido van Rossum try: 660cd16bf640405065e4702539632ce577536207d88Guido van Rossum return self[key] 661cd16bf640405065e4702539632ce577536207d88Guido van Rossum except KeyError: 662cd16bf640405065e4702539632ce577536207d88Guido van Rossum return default 663cd16bf640405065e4702539632ce577536207d88Guido van Rossum 664cd16bf640405065e4702539632ce577536207d88Guido van Rossum def __contains__(self, key): 665cd16bf640405065e4702539632ce577536207d88Guido van Rossum try: 666cd16bf640405065e4702539632ce577536207d88Guido van Rossum self[key] 667cd16bf640405065e4702539632ce577536207d88Guido van Rossum except KeyError: 668cd16bf640405065e4702539632ce577536207d88Guido van Rossum return False 669cd16bf640405065e4702539632ce577536207d88Guido van Rossum else: 670cd16bf640405065e4702539632ce577536207d88Guido van Rossum return True 671cd16bf640405065e4702539632ce577536207d88Guido van Rossum 672cd16bf640405065e4702539632ce577536207d88Guido van Rossum def keys(self): 673153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger "D.keys() -> a set-like object providing a view on D's keys" 674cd16bf640405065e4702539632ce577536207d88Guido van Rossum return KeysView(self) 675cd16bf640405065e4702539632ce577536207d88Guido van Rossum 676cd16bf640405065e4702539632ce577536207d88Guido van Rossum def items(self): 677153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger "D.items() -> a set-like object providing a view on D's items" 678cd16bf640405065e4702539632ce577536207d88Guido van Rossum return ItemsView(self) 679cd16bf640405065e4702539632ce577536207d88Guido van Rossum 680cd16bf640405065e4702539632ce577536207d88Guido van Rossum def values(self): 681153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger "D.values() -> an object providing a view on D's values" 682cd16bf640405065e4702539632ce577536207d88Guido van Rossum return ValuesView(self) 683cd16bf640405065e4702539632ce577536207d88Guido van Rossum 684b9da9bc0a04b718e8395e2e88c3053ab944579b7Raymond Hettinger def __eq__(self, other): 6854ad6bd5482514631680cebea3cdf06c56b87bac8Benjamin Peterson if not isinstance(other, Mapping): 6864ad6bd5482514631680cebea3cdf06c56b87bac8Benjamin Peterson return NotImplemented 6874ad6bd5482514631680cebea3cdf06c56b87bac8Benjamin Peterson return dict(self.items()) == dict(other.items()) 688b9da9bc0a04b718e8395e2e88c3053ab944579b7Raymond Hettinger 68997c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum __reversed__ = None 69097c1adf3935234da716d3289b85f72dcd67e90c2Guido van Rossum 6917b17a4e117fa6ad9f0063aa2f039930f40d91820Victor StinnerMapping.register(mappingproxy) 6927b17a4e117fa6ad9f0063aa2f039930f40d91820Victor Stinner 6932202f877b1fdd13ae94dd7dc559b44903baf2f99Christian Heimes 694bfd061218b153f1d30b6bd344e947b4ae0fd49a5Raymond Hettingerclass MappingView(Sized): 695cd16bf640405065e4702539632ce577536207d88Guido van Rossum 6963170d1cccb15d7ad94658944e3aba1a1e753adbfRaymond Hettinger __slots__ = '_mapping', 6973170d1cccb15d7ad94658944e3aba1a1e753adbfRaymond Hettinger 698cd16bf640405065e4702539632ce577536207d88Guido van Rossum def __init__(self, mapping): 699cd16bf640405065e4702539632ce577536207d88Guido van Rossum self._mapping = mapping 700cd16bf640405065e4702539632ce577536207d88Guido van Rossum 701cd16bf640405065e4702539632ce577536207d88Guido van Rossum def __len__(self): 702cd16bf640405065e4702539632ce577536207d88Guido van Rossum return len(self._mapping) 703cd16bf640405065e4702539632ce577536207d88Guido van Rossum 70489fc2b78214b97f7bc5d3fcf32d9e4cb9940c1ddRaymond Hettinger def __repr__(self): 70589fc2b78214b97f7bc5d3fcf32d9e4cb9940c1ddRaymond Hettinger return '{0.__class__.__name__}({0._mapping!r})'.format(self) 70689fc2b78214b97f7bc5d3fcf32d9e4cb9940c1ddRaymond Hettinger 707cd16bf640405065e4702539632ce577536207d88Guido van Rossum 708cd16bf640405065e4702539632ce577536207d88Guido van Rossumclass KeysView(MappingView, Set): 709cd16bf640405065e4702539632ce577536207d88Guido van Rossum 7103170d1cccb15d7ad94658944e3aba1a1e753adbfRaymond Hettinger __slots__ = () 7113170d1cccb15d7ad94658944e3aba1a1e753adbfRaymond Hettinger 7129117c751488a98810d758f15b3113527beb920efRaymond Hettinger @classmethod 7139117c751488a98810d758f15b3113527beb920efRaymond Hettinger def _from_iterable(self, it): 7149117c751488a98810d758f15b3113527beb920efRaymond Hettinger return set(it) 7159117c751488a98810d758f15b3113527beb920efRaymond Hettinger 716cd16bf640405065e4702539632ce577536207d88Guido van Rossum def __contains__(self, key): 717cd16bf640405065e4702539632ce577536207d88Guido van Rossum return key in self._mapping 718cd16bf640405065e4702539632ce577536207d88Guido van Rossum 719cd16bf640405065e4702539632ce577536207d88Guido van Rossum def __iter__(self): 7204993cc0a5b34dc91da2b41c50e33d809f0191355Philip Jenvey yield from self._mapping 721cd16bf640405065e4702539632ce577536207d88Guido van Rossum 722f83be4e3f353c4cfb53a22793dd1394797988c30Christian HeimesKeysView.register(dict_keys) 723cd16bf640405065e4702539632ce577536207d88Guido van Rossum 724cd16bf640405065e4702539632ce577536207d88Guido van Rossum 725cd16bf640405065e4702539632ce577536207d88Guido van Rossumclass ItemsView(MappingView, Set): 726cd16bf640405065e4702539632ce577536207d88Guido van Rossum 7273170d1cccb15d7ad94658944e3aba1a1e753adbfRaymond Hettinger __slots__ = () 7283170d1cccb15d7ad94658944e3aba1a1e753adbfRaymond Hettinger 7299117c751488a98810d758f15b3113527beb920efRaymond Hettinger @classmethod 7309117c751488a98810d758f15b3113527beb920efRaymond Hettinger def _from_iterable(self, it): 7319117c751488a98810d758f15b3113527beb920efRaymond Hettinger return set(it) 7329117c751488a98810d758f15b3113527beb920efRaymond Hettinger 733cd16bf640405065e4702539632ce577536207d88Guido van Rossum def __contains__(self, item): 734cd16bf640405065e4702539632ce577536207d88Guido van Rossum key, value = item 735cd16bf640405065e4702539632ce577536207d88Guido van Rossum try: 736cd16bf640405065e4702539632ce577536207d88Guido van Rossum v = self._mapping[key] 737cd16bf640405065e4702539632ce577536207d88Guido van Rossum except KeyError: 738cd16bf640405065e4702539632ce577536207d88Guido van Rossum return False 739cd16bf640405065e4702539632ce577536207d88Guido van Rossum else: 740584e8aedc3d66721efcdcbd1a43d4c5b7476427bRaymond Hettinger return v is value or v == value 741cd16bf640405065e4702539632ce577536207d88Guido van Rossum 742cd16bf640405065e4702539632ce577536207d88Guido van Rossum def __iter__(self): 743cd16bf640405065e4702539632ce577536207d88Guido van Rossum for key in self._mapping: 744cd16bf640405065e4702539632ce577536207d88Guido van Rossum yield (key, self._mapping[key]) 745cd16bf640405065e4702539632ce577536207d88Guido van Rossum 746f83be4e3f353c4cfb53a22793dd1394797988c30Christian HeimesItemsView.register(dict_items) 747cd16bf640405065e4702539632ce577536207d88Guido van Rossum 748cd16bf640405065e4702539632ce577536207d88Guido van Rossum 749cd16bf640405065e4702539632ce577536207d88Guido van Rossumclass ValuesView(MappingView): 750cd16bf640405065e4702539632ce577536207d88Guido van Rossum 7513170d1cccb15d7ad94658944e3aba1a1e753adbfRaymond Hettinger __slots__ = () 7523170d1cccb15d7ad94658944e3aba1a1e753adbfRaymond Hettinger 753cd16bf640405065e4702539632ce577536207d88Guido van Rossum def __contains__(self, value): 754cd16bf640405065e4702539632ce577536207d88Guido van Rossum for key in self._mapping: 755584e8aedc3d66721efcdcbd1a43d4c5b7476427bRaymond Hettinger v = self._mapping[key] 756584e8aedc3d66721efcdcbd1a43d4c5b7476427bRaymond Hettinger if v is value or v == value: 757cd16bf640405065e4702539632ce577536207d88Guido van Rossum return True 758cd16bf640405065e4702539632ce577536207d88Guido van Rossum return False 759cd16bf640405065e4702539632ce577536207d88Guido van Rossum 760cd16bf640405065e4702539632ce577536207d88Guido van Rossum def __iter__(self): 761cd16bf640405065e4702539632ce577536207d88Guido van Rossum for key in self._mapping: 762cd16bf640405065e4702539632ce577536207d88Guido van Rossum yield self._mapping[key] 763cd16bf640405065e4702539632ce577536207d88Guido van Rossum 764f83be4e3f353c4cfb53a22793dd1394797988c30Christian HeimesValuesView.register(dict_values) 765cd16bf640405065e4702539632ce577536207d88Guido van Rossum 766cd16bf640405065e4702539632ce577536207d88Guido van Rossum 767cd16bf640405065e4702539632ce577536207d88Guido van Rossumclass MutableMapping(Mapping): 768cd16bf640405065e4702539632ce577536207d88Guido van Rossum 769c46759ad0b3419bb67b33f0358af5ae50dc0c5feRaymond Hettinger __slots__ = () 770c46759ad0b3419bb67b33f0358af5ae50dc0c5feRaymond Hettinger 771153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger """A MutableMapping is a generic container for associating 772153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger key/value pairs. 773153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger 774153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger This class provides concrete generic implementations of all 775153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger methods except for __getitem__, __setitem__, __delitem__, 776153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger __iter__, and __len__. 777153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger 778153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger """ 779153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger 780cd16bf640405065e4702539632ce577536207d88Guido van Rossum @abstractmethod 781cd16bf640405065e4702539632ce577536207d88Guido van Rossum def __setitem__(self, key, value): 782cd16bf640405065e4702539632ce577536207d88Guido van Rossum raise KeyError 783cd16bf640405065e4702539632ce577536207d88Guido van Rossum 784cd16bf640405065e4702539632ce577536207d88Guido van Rossum @abstractmethod 785cd16bf640405065e4702539632ce577536207d88Guido van Rossum def __delitem__(self, key): 786cd16bf640405065e4702539632ce577536207d88Guido van Rossum raise KeyError 787cd16bf640405065e4702539632ce577536207d88Guido van Rossum 788cd16bf640405065e4702539632ce577536207d88Guido van Rossum __marker = object() 789cd16bf640405065e4702539632ce577536207d88Guido van Rossum 790cd16bf640405065e4702539632ce577536207d88Guido van Rossum def pop(self, key, default=__marker): 791153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value. 792153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger If key is not found, d is returned if given, otherwise KeyError is raised. 793153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger ''' 794cd16bf640405065e4702539632ce577536207d88Guido van Rossum try: 795cd16bf640405065e4702539632ce577536207d88Guido van Rossum value = self[key] 796cd16bf640405065e4702539632ce577536207d88Guido van Rossum except KeyError: 797cd16bf640405065e4702539632ce577536207d88Guido van Rossum if default is self.__marker: 798cd16bf640405065e4702539632ce577536207d88Guido van Rossum raise 799cd16bf640405065e4702539632ce577536207d88Guido van Rossum return default 800cd16bf640405065e4702539632ce577536207d88Guido van Rossum else: 801cd16bf640405065e4702539632ce577536207d88Guido van Rossum del self[key] 802cd16bf640405065e4702539632ce577536207d88Guido van Rossum return value 803cd16bf640405065e4702539632ce577536207d88Guido van Rossum 804cd16bf640405065e4702539632ce577536207d88Guido van Rossum def popitem(self): 805153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger '''D.popitem() -> (k, v), remove and return some (key, value) pair 806153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger as a 2-tuple; but raise KeyError if D is empty. 807153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger ''' 808cd16bf640405065e4702539632ce577536207d88Guido van Rossum try: 809cd16bf640405065e4702539632ce577536207d88Guido van Rossum key = next(iter(self)) 810cd16bf640405065e4702539632ce577536207d88Guido van Rossum except StopIteration: 811cd16bf640405065e4702539632ce577536207d88Guido van Rossum raise KeyError 812cd16bf640405065e4702539632ce577536207d88Guido van Rossum value = self[key] 813cd16bf640405065e4702539632ce577536207d88Guido van Rossum del self[key] 814cd16bf640405065e4702539632ce577536207d88Guido van Rossum return key, value 815cd16bf640405065e4702539632ce577536207d88Guido van Rossum 816cd16bf640405065e4702539632ce577536207d88Guido van Rossum def clear(self): 817153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger 'D.clear() -> None. Remove all items from D.' 818cd16bf640405065e4702539632ce577536207d88Guido van Rossum try: 819cd16bf640405065e4702539632ce577536207d88Guido van Rossum while True: 820cd16bf640405065e4702539632ce577536207d88Guido van Rossum self.popitem() 821cd16bf640405065e4702539632ce577536207d88Guido van Rossum except KeyError: 822cd16bf640405065e4702539632ce577536207d88Guido van Rossum pass 823cd16bf640405065e4702539632ce577536207d88Guido van Rossum 824b214e90e010f86b7d899cd88ada8c68fff90c870Mark Dickinson def update(*args, **kwds): 825153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger ''' D.update([E, ]**F) -> None. Update D from mapping/iterable E and F. 826153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger If E present and has a .keys() method, does: for k in E: D[k] = E[k] 827153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v 828153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger In either case, this is followed by: for k, v in F.items(): D[k] = v 829153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger ''' 830ae5cb214d2cd41d96943a0ef43a4e95bd9a10b7aSerhiy Storchaka if not args: 831ae5cb214d2cd41d96943a0ef43a4e95bd9a10b7aSerhiy Storchaka raise TypeError("descriptor 'update' of 'MutableMapping' object " 832ae5cb214d2cd41d96943a0ef43a4e95bd9a10b7aSerhiy Storchaka "needs an argument") 833ae5cb214d2cd41d96943a0ef43a4e95bd9a10b7aSerhiy Storchaka self, *args = args 834ae5cb214d2cd41d96943a0ef43a4e95bd9a10b7aSerhiy Storchaka if len(args) > 1: 835ae5cb214d2cd41d96943a0ef43a4e95bd9a10b7aSerhiy Storchaka raise TypeError('update expected at most 1 arguments, got %d' % 836ae5cb214d2cd41d96943a0ef43a4e95bd9a10b7aSerhiy Storchaka len(args)) 837ae5cb214d2cd41d96943a0ef43a4e95bd9a10b7aSerhiy Storchaka if args: 838ae5cb214d2cd41d96943a0ef43a4e95bd9a10b7aSerhiy Storchaka other = args[0] 839ae5cb214d2cd41d96943a0ef43a4e95bd9a10b7aSerhiy Storchaka if isinstance(other, Mapping): 840ae5cb214d2cd41d96943a0ef43a4e95bd9a10b7aSerhiy Storchaka for key in other: 841ae5cb214d2cd41d96943a0ef43a4e95bd9a10b7aSerhiy Storchaka self[key] = other[key] 842ae5cb214d2cd41d96943a0ef43a4e95bd9a10b7aSerhiy Storchaka elif hasattr(other, "keys"): 843ae5cb214d2cd41d96943a0ef43a4e95bd9a10b7aSerhiy Storchaka for key in other.keys(): 844ae5cb214d2cd41d96943a0ef43a4e95bd9a10b7aSerhiy Storchaka self[key] = other[key] 845ae5cb214d2cd41d96943a0ef43a4e95bd9a10b7aSerhiy Storchaka else: 846ae5cb214d2cd41d96943a0ef43a4e95bd9a10b7aSerhiy Storchaka for key, value in other: 847ae5cb214d2cd41d96943a0ef43a4e95bd9a10b7aSerhiy Storchaka self[key] = value 848cd16bf640405065e4702539632ce577536207d88Guido van Rossum for key, value in kwds.items(): 849cd16bf640405065e4702539632ce577536207d88Guido van Rossum self[key] = value 850cd16bf640405065e4702539632ce577536207d88Guido van Rossum 851b9da9bc0a04b718e8395e2e88c3053ab944579b7Raymond Hettinger def setdefault(self, key, default=None): 852153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger 'D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D' 853b9da9bc0a04b718e8395e2e88c3053ab944579b7Raymond Hettinger try: 854b9da9bc0a04b718e8395e2e88c3053ab944579b7Raymond Hettinger return self[key] 855b9da9bc0a04b718e8395e2e88c3053ab944579b7Raymond Hettinger except KeyError: 856b9da9bc0a04b718e8395e2e88c3053ab944579b7Raymond Hettinger self[key] = default 857b9da9bc0a04b718e8395e2e88c3053ab944579b7Raymond Hettinger return default 858b9da9bc0a04b718e8395e2e88c3053ab944579b7Raymond Hettinger 859cd16bf640405065e4702539632ce577536207d88Guido van RossumMutableMapping.register(dict) 860cd16bf640405065e4702539632ce577536207d88Guido van Rossum 861cd16bf640405065e4702539632ce577536207d88Guido van Rossum 862cd16bf640405065e4702539632ce577536207d88Guido van Rossum### SEQUENCES ### 863cd16bf640405065e4702539632ce577536207d88Guido van Rossum 864cd16bf640405065e4702539632ce577536207d88Guido van Rossum 865f0666949fda1f418eb656b7503b4609e6bd58163Guido van Rossumclass Sequence(Reversible, Collection): 866cd16bf640405065e4702539632ce577536207d88Guido van Rossum 867cd16bf640405065e4702539632ce577536207d88Guido van Rossum """All the operations on a read-only sequence. 868cd16bf640405065e4702539632ce577536207d88Guido van Rossum 869cd16bf640405065e4702539632ce577536207d88Guido van Rossum Concrete subclasses must override __new__ or __init__, 870cd16bf640405065e4702539632ce577536207d88Guido van Rossum __getitem__, and __len__. 871cd16bf640405065e4702539632ce577536207d88Guido van Rossum """ 872cd16bf640405065e4702539632ce577536207d88Guido van Rossum 873c46759ad0b3419bb67b33f0358af5ae50dc0c5feRaymond Hettinger __slots__ = () 874c46759ad0b3419bb67b33f0358af5ae50dc0c5feRaymond Hettinger 875cd16bf640405065e4702539632ce577536207d88Guido van Rossum @abstractmethod 876cd16bf640405065e4702539632ce577536207d88Guido van Rossum def __getitem__(self, index): 877cd16bf640405065e4702539632ce577536207d88Guido van Rossum raise IndexError 878cd16bf640405065e4702539632ce577536207d88Guido van Rossum 879cd16bf640405065e4702539632ce577536207d88Guido van Rossum def __iter__(self): 880cd16bf640405065e4702539632ce577536207d88Guido van Rossum i = 0 88171909423fd92862b869d8019d5e10c29bf946cb0Raymond Hettinger try: 88271909423fd92862b869d8019d5e10c29bf946cb0Raymond Hettinger while True: 883cd16bf640405065e4702539632ce577536207d88Guido van Rossum v = self[i] 88471909423fd92862b869d8019d5e10c29bf946cb0Raymond Hettinger yield v 88571909423fd92862b869d8019d5e10c29bf946cb0Raymond Hettinger i += 1 88671909423fd92862b869d8019d5e10c29bf946cb0Raymond Hettinger except IndexError: 88771909423fd92862b869d8019d5e10c29bf946cb0Raymond Hettinger return 888cd16bf640405065e4702539632ce577536207d88Guido van Rossum 889cd16bf640405065e4702539632ce577536207d88Guido van Rossum def __contains__(self, value): 890cd16bf640405065e4702539632ce577536207d88Guido van Rossum for v in self: 891584e8aedc3d66721efcdcbd1a43d4c5b7476427bRaymond Hettinger if v is value or v == value: 892cd16bf640405065e4702539632ce577536207d88Guido van Rossum return True 893cd16bf640405065e4702539632ce577536207d88Guido van Rossum return False 894cd16bf640405065e4702539632ce577536207d88Guido van Rossum 895cd16bf640405065e4702539632ce577536207d88Guido van Rossum def __reversed__(self): 896cd16bf640405065e4702539632ce577536207d88Guido van Rossum for i in reversed(range(len(self))): 897cd16bf640405065e4702539632ce577536207d88Guido van Rossum yield self[i] 898cd16bf640405065e4702539632ce577536207d88Guido van Rossum 899ec219ba1c04c4514b8b004239b1a0eac914dde4aRaymond Hettinger def index(self, value, start=0, stop=None): 900ec219ba1c04c4514b8b004239b1a0eac914dde4aRaymond Hettinger '''S.index(value, [start, [stop]]) -> integer -- return first index of value. 901153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger Raises ValueError if the value is not present. 902153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger ''' 903ec219ba1c04c4514b8b004239b1a0eac914dde4aRaymond Hettinger if start is not None and start < 0: 904ec219ba1c04c4514b8b004239b1a0eac914dde4aRaymond Hettinger start = max(len(self) + start, 0) 905ec219ba1c04c4514b8b004239b1a0eac914dde4aRaymond Hettinger if stop is not None and stop < 0: 906ec219ba1c04c4514b8b004239b1a0eac914dde4aRaymond Hettinger stop += len(self) 907ec219ba1c04c4514b8b004239b1a0eac914dde4aRaymond Hettinger 908ec219ba1c04c4514b8b004239b1a0eac914dde4aRaymond Hettinger i = start 909ec219ba1c04c4514b8b004239b1a0eac914dde4aRaymond Hettinger while stop is None or i < stop: 910ec219ba1c04c4514b8b004239b1a0eac914dde4aRaymond Hettinger try: 911ec219ba1c04c4514b8b004239b1a0eac914dde4aRaymond Hettinger if self[i] == value: 912ec219ba1c04c4514b8b004239b1a0eac914dde4aRaymond Hettinger return i 913ec219ba1c04c4514b8b004239b1a0eac914dde4aRaymond Hettinger except IndexError: 914ec219ba1c04c4514b8b004239b1a0eac914dde4aRaymond Hettinger break 915ec219ba1c04c4514b8b004239b1a0eac914dde4aRaymond Hettinger i += 1 916cd16bf640405065e4702539632ce577536207d88Guido van Rossum raise ValueError 917cd16bf640405065e4702539632ce577536207d88Guido van Rossum 918cd16bf640405065e4702539632ce577536207d88Guido van Rossum def count(self, value): 919153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger 'S.count(value) -> integer -- return number of occurrences of value' 920cd16bf640405065e4702539632ce577536207d88Guido van Rossum return sum(1 for v in self if v == value) 921cd16bf640405065e4702539632ce577536207d88Guido van Rossum 922cd16bf640405065e4702539632ce577536207d88Guido van RossumSequence.register(tuple) 9233172c5d263eeffff1e89d03d79be3ccc1d60fbdeGuido van RossumSequence.register(str) 9249aa53c2f0151032c5592d0c8b112fc35d7f77078Raymond HettingerSequence.register(range) 92545163ccce42ddf7840188c0c91e66ceeb28f0e58Nick CoghlanSequence.register(memoryview) 926d05eb0043e597cf2d5c429d0e554fd39364e36b0Guido van Rossum 927d05eb0043e597cf2d5c429d0e554fd39364e36b0Guido van Rossum 928d05eb0043e597cf2d5c429d0e554fd39364e36b0Guido van Rossumclass ByteString(Sequence): 929d05eb0043e597cf2d5c429d0e554fd39364e36b0Guido van Rossum 930d05eb0043e597cf2d5c429d0e554fd39364e36b0Guido van Rossum """This unifies bytes and bytearray. 931d05eb0043e597cf2d5c429d0e554fd39364e36b0Guido van Rossum 932d05eb0043e597cf2d5c429d0e554fd39364e36b0Guido van Rossum XXX Should add all their methods. 933d05eb0043e597cf2d5c429d0e554fd39364e36b0Guido van Rossum """ 934d05eb0043e597cf2d5c429d0e554fd39364e36b0Guido van Rossum 935c46759ad0b3419bb67b33f0358af5ae50dc0c5feRaymond Hettinger __slots__ = () 936c46759ad0b3419bb67b33f0358af5ae50dc0c5feRaymond Hettinger 937d05eb0043e597cf2d5c429d0e554fd39364e36b0Guido van RossumByteString.register(bytes) 938d05eb0043e597cf2d5c429d0e554fd39364e36b0Guido van RossumByteString.register(bytearray) 939cd16bf640405065e4702539632ce577536207d88Guido van Rossum 940cd16bf640405065e4702539632ce577536207d88Guido van Rossum 941cd16bf640405065e4702539632ce577536207d88Guido van Rossumclass MutableSequence(Sequence): 942cd16bf640405065e4702539632ce577536207d88Guido van Rossum 943c46759ad0b3419bb67b33f0358af5ae50dc0c5feRaymond Hettinger __slots__ = () 944c46759ad0b3419bb67b33f0358af5ae50dc0c5feRaymond Hettinger 945840c310a2577459dd9f6ac9f5f9b136d7f4829f8Guido van Rossum """All the operations on a read-write sequence. 946153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger 947153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger Concrete subclasses must provide __new__ or __init__, 948153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger __getitem__, __setitem__, __delitem__, __len__, and insert(). 949153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger 950153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger """ 951153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger 952cd16bf640405065e4702539632ce577536207d88Guido van Rossum @abstractmethod 953cd16bf640405065e4702539632ce577536207d88Guido van Rossum def __setitem__(self, index, value): 954cd16bf640405065e4702539632ce577536207d88Guido van Rossum raise IndexError 955cd16bf640405065e4702539632ce577536207d88Guido van Rossum 956cd16bf640405065e4702539632ce577536207d88Guido van Rossum @abstractmethod 957cd16bf640405065e4702539632ce577536207d88Guido van Rossum def __delitem__(self, index): 958cd16bf640405065e4702539632ce577536207d88Guido van Rossum raise IndexError 959cd16bf640405065e4702539632ce577536207d88Guido van Rossum 960cd16bf640405065e4702539632ce577536207d88Guido van Rossum @abstractmethod 961cd16bf640405065e4702539632ce577536207d88Guido van Rossum def insert(self, index, value): 962153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger 'S.insert(index, value) -- insert value before index' 963cd16bf640405065e4702539632ce577536207d88Guido van Rossum raise IndexError 964cd16bf640405065e4702539632ce577536207d88Guido van Rossum 965cd16bf640405065e4702539632ce577536207d88Guido van Rossum def append(self, value): 966153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger 'S.append(value) -- append value to the end of the sequence' 967cd16bf640405065e4702539632ce577536207d88Guido van Rossum self.insert(len(self), value) 968cd16bf640405065e4702539632ce577536207d88Guido van Rossum 9699479d1ade84d7a386a107989b699fb90b73cfa15Eli Bendersky def clear(self): 970153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger 'S.clear() -> None -- remove all items from S' 9719479d1ade84d7a386a107989b699fb90b73cfa15Eli Bendersky try: 9729479d1ade84d7a386a107989b699fb90b73cfa15Eli Bendersky while True: 9739479d1ade84d7a386a107989b699fb90b73cfa15Eli Bendersky self.pop() 9749479d1ade84d7a386a107989b699fb90b73cfa15Eli Bendersky except IndexError: 9759479d1ade84d7a386a107989b699fb90b73cfa15Eli Bendersky pass 9769479d1ade84d7a386a107989b699fb90b73cfa15Eli Bendersky 977cd16bf640405065e4702539632ce577536207d88Guido van Rossum def reverse(self): 978153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger 'S.reverse() -- reverse *IN PLACE*' 979cd16bf640405065e4702539632ce577536207d88Guido van Rossum n = len(self) 980cd16bf640405065e4702539632ce577536207d88Guido van Rossum for i in range(n//2): 981cd16bf640405065e4702539632ce577536207d88Guido van Rossum self[i], self[n-i-1] = self[n-i-1], self[i] 982cd16bf640405065e4702539632ce577536207d88Guido van Rossum 983cd16bf640405065e4702539632ce577536207d88Guido van Rossum def extend(self, values): 984153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger 'S.extend(iterable) -- extend sequence by appending elements from the iterable' 985cd16bf640405065e4702539632ce577536207d88Guido van Rossum for v in values: 986cd16bf640405065e4702539632ce577536207d88Guido van Rossum self.append(v) 987cd16bf640405065e4702539632ce577536207d88Guido van Rossum 988cd16bf640405065e4702539632ce577536207d88Guido van Rossum def pop(self, index=-1): 989153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger '''S.pop([index]) -> item -- remove and return item at index (default last). 990153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger Raise IndexError if list is empty or index is out of range. 991153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger ''' 992cd16bf640405065e4702539632ce577536207d88Guido van Rossum v = self[index] 993cd16bf640405065e4702539632ce577536207d88Guido van Rossum del self[index] 994cd16bf640405065e4702539632ce577536207d88Guido van Rossum return v 995cd16bf640405065e4702539632ce577536207d88Guido van Rossum 996cd16bf640405065e4702539632ce577536207d88Guido van Rossum def remove(self, value): 997153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger '''S.remove(value) -- remove first occurrence of value. 998153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger Raise ValueError if the value is not present. 999153866ea9ab80323d247a9c49d1fdf50e07e7330Raymond Hettinger ''' 1000cd16bf640405065e4702539632ce577536207d88Guido van Rossum del self[self.index(value)] 1001cd16bf640405065e4702539632ce577536207d88Guido van Rossum 1002cd16bf640405065e4702539632ce577536207d88Guido van Rossum def __iadd__(self, values): 1003cd16bf640405065e4702539632ce577536207d88Guido van Rossum self.extend(values) 1004c384b226d765d5f57a909df8da3f4fcdfb4b7246Raymond Hettinger return self 1005cd16bf640405065e4702539632ce577536207d88Guido van Rossum 1006cd16bf640405065e4702539632ce577536207d88Guido van RossumMutableSequence.register(list) 1007d05eb0043e597cf2d5c429d0e554fd39364e36b0Guido van RossumMutableSequence.register(bytearray) # Multiply inheriting, see ByteString 1008