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