blob: bff58ad4a7f6a72c8b2c6eb6d52f41008e3655df [file] [log] [blame]
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001# Copyright 2007 Google, Inc. All Rights Reserved.
2# Licensed to PSF under a Contributor Agreement.
3
4"""Abstract Base Classes (ABCs) for collections, according to PEP 3119.
5
Raymond Hettinger158c9c22011-02-22 00:41:50 +00006Unit tests are in test_collections.
Guido van Rossumcd16bf62007-06-13 18:07:49 +00007"""
8
9from abc import ABCMeta, abstractmethod
Benjamin Peterson41181742008-07-02 20:22:54 +000010import sys
Guido van Rossumcd16bf62007-06-13 18:07:49 +000011
Guido van Rossum48b069a2020-04-07 09:50:06 -070012GenericAlias = type(list[int])
kj463c7d32020-12-14 02:38:24 +080013EllipsisType = type(...)
14def _f(): pass
15FunctionType = type(_f)
16del _f
Guido van Rossum48b069a2020-04-07 09:50:06 -070017
Yury Selivanov22214ab2016-11-16 18:25:04 -050018__all__ = ["Awaitable", "Coroutine",
19 "AsyncIterable", "AsyncIterator", "AsyncGenerator",
Guido van Rossum16ca06b2016-04-04 10:59:29 -070020 "Hashable", "Iterable", "Iterator", "Generator", "Reversible",
Guido van Rossumf0666942016-08-23 10:47:07 -070021 "Sized", "Container", "Callable", "Collection",
Guido van Rossumcd16bf62007-06-13 18:07:49 +000022 "Set", "MutableSet",
23 "Mapping", "MutableMapping",
24 "MappingView", "KeysView", "ItemsView", "ValuesView",
25 "Sequence", "MutableSequence",
Guido van Rossumd05eb002007-11-21 22:26:24 +000026 "ByteString",
Guido van Rossumcd16bf62007-06-13 18:07:49 +000027 ]
28
Christian Heimesbf235bd2013-10-13 02:21:33 +020029# This module has been renamed from collections.abc to _collections_abc to
30# speed up interpreter startup. Some of the types such as MutableMapping are
31# required early but collections module imports a lot of other modules.
32# See issue #19218
33__name__ = "collections.abc"
34
Raymond Hettinger02184282012-04-05 13:31:12 -070035# Private list of types that we want to register with the various ABCs
36# so that they will pass tests like:
37# it = iter(somebytearray)
38# assert isinstance(it, Iterable)
Serhiy Storchaka3bd9fde2016-10-08 21:33:59 +030039# Note: in other implementations, these types might not be distinct
40# and they may have their own implementation specific types that
Raymond Hettinger02184282012-04-05 13:31:12 -070041# are not included on this list.
Christian Heimesf83be4e2007-11-28 09:44:38 +000042bytes_iterator = type(iter(b''))
43bytearray_iterator = type(iter(bytearray()))
44#callable_iterator = ???
45dict_keyiterator = type(iter({}.keys()))
46dict_valueiterator = type(iter({}.values()))
47dict_itemiterator = type(iter({}.items()))
48list_iterator = type(iter([]))
49list_reverseiterator = type(iter(reversed([])))
50range_iterator = type(iter(range(0)))
Serhiy Storchaka48b1c3f2016-10-08 22:04:12 +030051longrange_iterator = type(iter(range(1 << 1000)))
Christian Heimesf83be4e2007-11-28 09:44:38 +000052set_iterator = type(iter(set()))
53str_iterator = type(iter(""))
54tuple_iterator = type(iter(()))
55zip_iterator = type(iter(zip()))
56## views ##
57dict_keys = type({}.keys())
58dict_values = type({}.values())
59dict_items = type({}.items())
Christian Heimes0db38532007-11-29 16:21:13 +000060## misc ##
Victor Stinner7b17a4e2012-04-20 01:41:36 +020061mappingproxy = type(type.__dict__)
Raymond Hettingerbd60e8d2015-05-09 01:07:23 -040062generator = type((lambda: (yield))())
Yury Selivanov5376ba92015-06-22 12:19:30 -040063## coroutine ##
64async def _coro(): pass
65_coro = _coro()
66coroutine = type(_coro)
67_coro.close() # Prevent ResourceWarning
68del _coro
Yury Selivanov22214ab2016-11-16 18:25:04 -050069## asynchronous generator ##
70async def _ag(): yield
71_ag = _ag()
72async_generator = type(_ag)
73del _ag
Christian Heimesf83be4e2007-11-28 09:44:38 +000074
75
Guido van Rossumcd16bf62007-06-13 18:07:49 +000076### ONE-TRICK PONIES ###
77
Guido van Rossum97c1adf2016-08-18 09:22:23 -070078def _check_methods(C, *methods):
79 mro = C.__mro__
80 for method in methods:
81 for B in mro:
82 if method in B.__dict__:
83 if B.__dict__[method] is None:
84 return NotImplemented
85 break
86 else:
87 return NotImplemented
88 return True
89
Guido van Rossumcd16bf62007-06-13 18:07:49 +000090class Hashable(metaclass=ABCMeta):
91
Raymond Hettingerc46759a2011-03-22 11:46:25 -070092 __slots__ = ()
93
Guido van Rossumcd16bf62007-06-13 18:07:49 +000094 @abstractmethod
95 def __hash__(self):
96 return 0
97
98 @classmethod
99 def __subclasshook__(cls, C):
100 if cls is Hashable:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700101 return _check_methods(C, "__hash__")
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000102 return NotImplemented
103
104
Yury Selivanovfdbeb2b2015-07-03 13:11:35 -0400105class Awaitable(metaclass=ABCMeta):
Yury Selivanov56fc6142015-05-29 09:01:29 -0400106
107 __slots__ = ()
108
109 @abstractmethod
110 def __await__(self):
111 yield
112
113 @classmethod
114 def __subclasshook__(cls, C):
115 if cls is Awaitable:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700116 return _check_methods(C, "__await__")
Yury Selivanov56fc6142015-05-29 09:01:29 -0400117 return NotImplemented
118
Guido van Rossum48b069a2020-04-07 09:50:06 -0700119 __class_getitem__ = classmethod(GenericAlias)
120
Yury Selivanov56fc6142015-05-29 09:01:29 -0400121
122class Coroutine(Awaitable):
Yury Selivanov75445082015-05-11 22:57:16 -0400123
124 __slots__ = ()
125
126 @abstractmethod
127 def send(self, value):
128 """Send a value into the coroutine.
129 Return next yielded value or raise StopIteration.
130 """
131 raise StopIteration
132
133 @abstractmethod
134 def throw(self, typ, val=None, tb=None):
135 """Raise an exception in the coroutine.
136 Return next yielded value or raise StopIteration.
137 """
138 if val is None:
139 if tb is None:
140 raise typ
141 val = typ()
142 if tb is not None:
143 val = val.with_traceback(tb)
144 raise val
145
146 def close(self):
147 """Raise GeneratorExit inside coroutine.
148 """
149 try:
150 self.throw(GeneratorExit)
151 except (GeneratorExit, StopIteration):
152 pass
153 else:
154 raise RuntimeError("coroutine ignored GeneratorExit")
155
Yury Selivanov75445082015-05-11 22:57:16 -0400156 @classmethod
157 def __subclasshook__(cls, C):
Yury Selivanov56fc6142015-05-29 09:01:29 -0400158 if cls is Coroutine:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700159 return _check_methods(C, '__await__', 'send', 'throw', 'close')
Yury Selivanov75445082015-05-11 22:57:16 -0400160 return NotImplemented
161
Yury Selivanov75445082015-05-11 22:57:16 -0400162
Yury Selivanov5376ba92015-06-22 12:19:30 -0400163Coroutine.register(coroutine)
164
165
Yury Selivanove0104ae2015-05-14 12:19:16 -0400166class AsyncIterable(metaclass=ABCMeta):
167
168 __slots__ = ()
169
170 @abstractmethod
Yury Selivanova6f6edb2016-06-09 15:08:31 -0400171 def __aiter__(self):
Yury Selivanove0104ae2015-05-14 12:19:16 -0400172 return AsyncIterator()
173
174 @classmethod
175 def __subclasshook__(cls, C):
176 if cls is AsyncIterable:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700177 return _check_methods(C, "__aiter__")
Yury Selivanove0104ae2015-05-14 12:19:16 -0400178 return NotImplemented
179
Guido van Rossum48b069a2020-04-07 09:50:06 -0700180 __class_getitem__ = classmethod(GenericAlias)
181
Yury Selivanove0104ae2015-05-14 12:19:16 -0400182
183class AsyncIterator(AsyncIterable):
184
185 __slots__ = ()
186
187 @abstractmethod
188 async def __anext__(self):
189 """Return the next item or raise StopAsyncIteration when exhausted."""
190 raise StopAsyncIteration
191
Yury Selivanova6f6edb2016-06-09 15:08:31 -0400192 def __aiter__(self):
Yury Selivanove0104ae2015-05-14 12:19:16 -0400193 return self
194
195 @classmethod
196 def __subclasshook__(cls, C):
197 if cls is AsyncIterator:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700198 return _check_methods(C, "__anext__", "__aiter__")
Yury Selivanove0104ae2015-05-14 12:19:16 -0400199 return NotImplemented
200
201
Yury Selivanov22214ab2016-11-16 18:25:04 -0500202class AsyncGenerator(AsyncIterator):
203
204 __slots__ = ()
205
206 async def __anext__(self):
207 """Return the next item from the asynchronous generator.
208 When exhausted, raise StopAsyncIteration.
209 """
210 return await self.asend(None)
211
212 @abstractmethod
213 async def asend(self, value):
214 """Send a value into the asynchronous generator.
215 Return next yielded value or raise StopAsyncIteration.
216 """
217 raise StopAsyncIteration
218
219 @abstractmethod
220 async def athrow(self, typ, val=None, tb=None):
221 """Raise an exception in the asynchronous generator.
222 Return next yielded value or raise StopAsyncIteration.
223 """
224 if val is None:
225 if tb is None:
226 raise typ
227 val = typ()
228 if tb is not None:
229 val = val.with_traceback(tb)
230 raise val
231
232 async def aclose(self):
233 """Raise GeneratorExit inside coroutine.
234 """
235 try:
236 await self.athrow(GeneratorExit)
237 except (GeneratorExit, StopAsyncIteration):
238 pass
239 else:
240 raise RuntimeError("asynchronous generator ignored GeneratorExit")
241
242 @classmethod
243 def __subclasshook__(cls, C):
244 if cls is AsyncGenerator:
245 return _check_methods(C, '__aiter__', '__anext__',
246 'asend', 'athrow', 'aclose')
247 return NotImplemented
248
249
250AsyncGenerator.register(async_generator)
251
252
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000253class Iterable(metaclass=ABCMeta):
254
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700255 __slots__ = ()
256
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000257 @abstractmethod
258 def __iter__(self):
259 while False:
260 yield None
261
262 @classmethod
263 def __subclasshook__(cls, C):
264 if cls is Iterable:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700265 return _check_methods(C, "__iter__")
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000266 return NotImplemented
267
Guido van Rossum48b069a2020-04-07 09:50:06 -0700268 __class_getitem__ = classmethod(GenericAlias)
269
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000270
Raymond Hettinger74b64952008-02-09 02:53:48 +0000271class Iterator(Iterable):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000272
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700273 __slots__ = ()
274
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000275 @abstractmethod
276 def __next__(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700277 'Return the next item from the iterator. When exhausted, raise StopIteration'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000278 raise StopIteration
279
280 def __iter__(self):
281 return self
282
283 @classmethod
284 def __subclasshook__(cls, C):
285 if cls is Iterator:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700286 return _check_methods(C, '__iter__', '__next__')
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000287 return NotImplemented
288
Guido van Rossum48b069a2020-04-07 09:50:06 -0700289
Christian Heimesf83be4e2007-11-28 09:44:38 +0000290Iterator.register(bytes_iterator)
291Iterator.register(bytearray_iterator)
292#Iterator.register(callable_iterator)
293Iterator.register(dict_keyiterator)
294Iterator.register(dict_valueiterator)
295Iterator.register(dict_itemiterator)
296Iterator.register(list_iterator)
297Iterator.register(list_reverseiterator)
298Iterator.register(range_iterator)
Serhiy Storchaka48b1c3f2016-10-08 22:04:12 +0300299Iterator.register(longrange_iterator)
Christian Heimesf83be4e2007-11-28 09:44:38 +0000300Iterator.register(set_iterator)
301Iterator.register(str_iterator)
302Iterator.register(tuple_iterator)
303Iterator.register(zip_iterator)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000304
Raymond Hettingerbd60e8d2015-05-09 01:07:23 -0400305
Guido van Rossum16ca06b2016-04-04 10:59:29 -0700306class Reversible(Iterable):
307
308 __slots__ = ()
309
310 @abstractmethod
311 def __reversed__(self):
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700312 while False:
313 yield None
Guido van Rossum16ca06b2016-04-04 10:59:29 -0700314
315 @classmethod
316 def __subclasshook__(cls, C):
317 if cls is Reversible:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700318 return _check_methods(C, "__reversed__", "__iter__")
Guido van Rossum16ca06b2016-04-04 10:59:29 -0700319 return NotImplemented
320
321
Raymond Hettingerbd60e8d2015-05-09 01:07:23 -0400322class Generator(Iterator):
323
324 __slots__ = ()
325
326 def __next__(self):
327 """Return the next item from the generator.
328 When exhausted, raise StopIteration.
329 """
330 return self.send(None)
331
332 @abstractmethod
333 def send(self, value):
334 """Send a value into the generator.
335 Return next yielded value or raise StopIteration.
336 """
337 raise StopIteration
338
339 @abstractmethod
340 def throw(self, typ, val=None, tb=None):
341 """Raise an exception in the generator.
342 Return next yielded value or raise StopIteration.
343 """
344 if val is None:
345 if tb is None:
346 raise typ
347 val = typ()
348 if tb is not None:
349 val = val.with_traceback(tb)
350 raise val
351
352 def close(self):
353 """Raise GeneratorExit inside generator.
354 """
355 try:
356 self.throw(GeneratorExit)
357 except (GeneratorExit, StopIteration):
358 pass
359 else:
360 raise RuntimeError("generator ignored GeneratorExit")
361
362 @classmethod
363 def __subclasshook__(cls, C):
364 if cls is Generator:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700365 return _check_methods(C, '__iter__', '__next__',
366 'send', 'throw', 'close')
Raymond Hettingerbd60e8d2015-05-09 01:07:23 -0400367 return NotImplemented
368
Guido van Rossum48b069a2020-04-07 09:50:06 -0700369
Raymond Hettingerbd60e8d2015-05-09 01:07:23 -0400370Generator.register(generator)
371
372
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000373class Sized(metaclass=ABCMeta):
374
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700375 __slots__ = ()
376
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000377 @abstractmethod
378 def __len__(self):
379 return 0
380
381 @classmethod
382 def __subclasshook__(cls, C):
383 if cls is Sized:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700384 return _check_methods(C, "__len__")
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000385 return NotImplemented
386
387
388class Container(metaclass=ABCMeta):
389
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700390 __slots__ = ()
391
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000392 @abstractmethod
393 def __contains__(self, x):
394 return False
395
396 @classmethod
397 def __subclasshook__(cls, C):
398 if cls is Container:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700399 return _check_methods(C, "__contains__")
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000400 return NotImplemented
401
Guido van Rossum48b069a2020-04-07 09:50:06 -0700402 __class_getitem__ = classmethod(GenericAlias)
403
404
Guido van Rossumf0666942016-08-23 10:47:07 -0700405class Collection(Sized, Iterable, Container):
406
407 __slots__ = ()
408
409 @classmethod
410 def __subclasshook__(cls, C):
411 if cls is Collection:
412 return _check_methods(C, "__len__", "__iter__", "__contains__")
413 return NotImplemented
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000414
Guido van Rossum48b069a2020-04-07 09:50:06 -0700415
kj463c7d32020-12-14 02:38:24 +0800416class _CallableGenericAlias(GenericAlias):
417 """ Represent `Callable[argtypes, resulttype]`.
418
kj73607be2020-12-24 12:33:48 +0800419 This sets ``__args__`` to a tuple containing the flattened ``argtypes``
kj463c7d32020-12-14 02:38:24 +0800420 followed by ``resulttype``.
421
422 Example: ``Callable[[int, str], float]`` sets ``__args__`` to
423 ``(int, str, float)``.
424 """
425
426 __slots__ = ()
427
428 def __new__(cls, origin, args):
429 return cls.__create_ga(origin, args)
430
431 @classmethod
432 def __create_ga(cls, origin, args):
433 if not isinstance(args, tuple) or len(args) != 2:
434 raise TypeError(
435 "Callable must be used as Callable[[arg, ...], result].")
436 t_args, t_result = args
kj6dd3da32020-12-24 10:47:40 +0800437 if isinstance(t_args, (list, tuple)):
kj463c7d32020-12-14 02:38:24 +0800438 ga_args = tuple(t_args) + (t_result,)
439 # This relaxes what t_args can be on purpose to allow things like
440 # PEP 612 ParamSpec. Responsibility for whether a user is using
441 # Callable[...] properly is deferred to static type checkers.
442 else:
443 ga_args = args
444 return super().__new__(cls, origin, ga_args)
445
Ken Jin859577c2021-04-28 23:38:14 +0800446 @property
447 def __parameters__(self):
448 params = []
449 for arg in self.__args__:
450 # Looks like a genericalias
451 if hasattr(arg, "__parameters__") and isinstance(arg.__parameters__, tuple):
452 params.extend(arg.__parameters__)
453 else:
454 if _is_typevarlike(arg):
455 params.append(arg)
456 return tuple(dict.fromkeys(params))
457
kj463c7d32020-12-14 02:38:24 +0800458 def __repr__(self):
kj73607be2020-12-24 12:33:48 +0800459 if _has_special_args(self.__args__):
kj463c7d32020-12-14 02:38:24 +0800460 return super().__repr__()
461 return (f'collections.abc.Callable'
462 f'[[{", ".join([_type_repr(a) for a in self.__args__[:-1]])}], '
463 f'{_type_repr(self.__args__[-1])}]')
464
465 def __reduce__(self):
466 args = self.__args__
kj73607be2020-12-24 12:33:48 +0800467 if not _has_special_args(args):
kj463c7d32020-12-14 02:38:24 +0800468 args = list(args[:-1]), args[-1]
469 return _CallableGenericAlias, (Callable, args)
470
kj6dd3da32020-12-24 10:47:40 +0800471 def __getitem__(self, item):
472 # Called during TypeVar substitution, returns the custom subclass
Ken Jin859577c2021-04-28 23:38:14 +0800473 # rather than the default types.GenericAlias object. Most of the
474 # code is copied from typing's _GenericAlias and the builtin
475 # types.GenericAlias.
kj6dd3da32020-12-24 10:47:40 +0800476
Ken Jin859577c2021-04-28 23:38:14 +0800477 # A special case in PEP 612 where if X = Callable[P, int],
478 # then X[int, str] == X[[int, str]].
479 param_len = len(self.__parameters__)
480 if param_len == 0:
481 raise TypeError(f'There are no type or parameter specification'
482 f'variables left in {self}')
483 if (param_len == 1
484 and isinstance(item, (tuple, list))
485 and len(item) > 1) or not isinstance(item, tuple):
486 item = (item,)
487 item_len = len(item)
488 if item_len != param_len:
489 raise TypeError(f'Too {"many" if item_len > param_len else "few"}'
490 f' arguments for {self};'
491 f' actual {item_len}, expected {param_len}')
492 subst = dict(zip(self.__parameters__, item))
493 new_args = []
494 for arg in self.__args__:
495 if _is_typevarlike(arg):
496 arg = subst[arg]
497 # Looks like a GenericAlias
498 elif hasattr(arg, '__parameters__') and isinstance(arg.__parameters__, tuple):
499 subparams = arg.__parameters__
500 if subparams:
501 subargs = tuple(subst[x] for x in subparams)
502 arg = arg[subargs]
503 new_args.append(arg)
504
505 # args[0] occurs due to things like Z[[int, str, bool]] from PEP 612
506 if not isinstance(new_args[0], (tuple, list)):
507 t_result = new_args[-1]
508 t_args = new_args[:-1]
509 new_args = (t_args, t_result)
510 return _CallableGenericAlias(Callable, tuple(new_args))
511
512def _is_typevarlike(arg):
513 obj = type(arg)
514 # looks like a TypeVar/ParamSpec
515 return (obj.__module__ == 'typing'
516 and obj.__name__ in {'ParamSpec', 'TypeVar'})
kj463c7d32020-12-14 02:38:24 +0800517
kj73607be2020-12-24 12:33:48 +0800518def _has_special_args(args):
519 """Checks if args[0] matches either ``...``, ``ParamSpec`` or
520 ``_ConcatenateGenericAlias`` from typing.py
521 """
522 if len(args) != 2:
523 return False
524 obj = args[0]
525 if obj is Ellipsis:
526 return True
527 obj = type(obj)
528 names = ('ParamSpec', '_ConcatenateGenericAlias')
529 return obj.__module__ == 'typing' and any(obj.__name__ == name for name in names)
530
531
kj463c7d32020-12-14 02:38:24 +0800532def _type_repr(obj):
533 """Return the repr() of an object, special-casing types (internal helper).
534
535 Copied from :mod:`typing` since collections.abc
536 shouldn't depend on that module.
537 """
538 if isinstance(obj, GenericAlias):
539 return repr(obj)
540 if isinstance(obj, type):
541 if obj.__module__ == 'builtins':
542 return obj.__qualname__
543 return f'{obj.__module__}.{obj.__qualname__}'
544 if obj is Ellipsis:
545 return '...'
546 if isinstance(obj, FunctionType):
547 return obj.__name__
548 return repr(obj)
549
550
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000551class Callable(metaclass=ABCMeta):
552
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700553 __slots__ = ()
554
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000555 @abstractmethod
Christian Heimes78644762008-03-04 23:39:23 +0000556 def __call__(self, *args, **kwds):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000557 return False
558
559 @classmethod
560 def __subclasshook__(cls, C):
561 if cls is Callable:
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700562 return _check_methods(C, "__call__")
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000563 return NotImplemented
564
kj463c7d32020-12-14 02:38:24 +0800565 __class_getitem__ = classmethod(_CallableGenericAlias)
Guido van Rossum48b069a2020-04-07 09:50:06 -0700566
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000567
568### SETS ###
569
570
Guido van Rossumf0666942016-08-23 10:47:07 -0700571class Set(Collection):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000572 """A set is a finite, iterable container.
573
574 This class provides concrete generic implementations of all
575 methods except for __contains__, __iter__ and __len__.
576
577 To override the comparisons (presumably for speed, as the
Raymond Hettinger11cda472014-07-03 00:31:30 +0100578 semantics are fixed), redefine __le__ and __ge__,
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000579 then the other operations will automatically follow suit.
580 """
581
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700582 __slots__ = ()
583
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000584 def __le__(self, other):
585 if not isinstance(other, Set):
586 return NotImplemented
587 if len(self) > len(other):
588 return False
589 for elem in self:
590 if elem not in other:
591 return False
592 return True
593
594 def __lt__(self, other):
595 if not isinstance(other, Set):
596 return NotImplemented
597 return len(self) < len(other) and self.__le__(other)
598
Raymond Hettinger71909422008-02-09 00:08:16 +0000599 def __gt__(self, other):
600 if not isinstance(other, Set):
601 return NotImplemented
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700602 return len(self) > len(other) and self.__ge__(other)
Raymond Hettinger71909422008-02-09 00:08:16 +0000603
604 def __ge__(self, other):
605 if not isinstance(other, Set):
606 return NotImplemented
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700607 if len(self) < len(other):
608 return False
609 for elem in other:
610 if elem not in self:
611 return False
612 return True
Raymond Hettinger71909422008-02-09 00:08:16 +0000613
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000614 def __eq__(self, other):
615 if not isinstance(other, Set):
616 return NotImplemented
617 return len(self) == len(other) and self.__le__(other)
618
619 @classmethod
620 def _from_iterable(cls, it):
Raymond Hettinger8284c4a2008-02-06 20:47:09 +0000621 '''Construct an instance of the class from any iterable input.
622
623 Must override this method if the class constructor signature
Raymond Hettinger7aebb642008-02-09 03:25:08 +0000624 does not accept an iterable for an input.
Raymond Hettinger8284c4a2008-02-06 20:47:09 +0000625 '''
Raymond Hettinger7aebb642008-02-09 03:25:08 +0000626 return cls(it)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000627
628 def __and__(self, other):
629 if not isinstance(other, Iterable):
630 return NotImplemented
631 return self._from_iterable(value for value in other if value in self)
632
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700633 __rand__ = __and__
634
Christian Heimes190d79e2008-01-30 11:58:22 +0000635 def isdisjoint(self, other):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700636 'Return True if two sets have a null intersection.'
Christian Heimes190d79e2008-01-30 11:58:22 +0000637 for value in other:
638 if value in self:
639 return False
640 return True
641
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000642 def __or__(self, other):
643 if not isinstance(other, Iterable):
644 return NotImplemented
Christian Heimes78644762008-03-04 23:39:23 +0000645 chain = (e for s in (self, other) for e in s)
646 return self._from_iterable(chain)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000647
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700648 __ror__ = __or__
649
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000650 def __sub__(self, other):
651 if not isinstance(other, Set):
652 if not isinstance(other, Iterable):
653 return NotImplemented
654 other = self._from_iterable(other)
655 return self._from_iterable(value for value in self
656 if value not in other)
657
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700658 def __rsub__(self, other):
659 if not isinstance(other, Set):
660 if not isinstance(other, Iterable):
661 return NotImplemented
662 other = self._from_iterable(other)
663 return self._from_iterable(value for value in other
664 if value not in self)
665
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000666 def __xor__(self, other):
667 if not isinstance(other, Set):
668 if not isinstance(other, Iterable):
669 return NotImplemented
670 other = self._from_iterable(other)
671 return (self - other) | (other - self)
672
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700673 __rxor__ = __xor__
674
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000675 def _hash(self):
676 """Compute the hash value of a set.
677
678 Note that we don't define __hash__: not all sets are hashable.
679 But if you define a hashable set type, its __hash__ should
680 call this function.
681
682 This must be compatible __eq__.
683
684 All sets ought to compare equal if they contain the same
685 elements, regardless of how they are implemented, and
686 regardless of the order of the elements; so there's not much
687 freedom for __eq__ or __hash__. We match the algorithm used
688 by the built-in frozenset type.
689 """
Christian Heimesa37d4c62007-12-04 23:02:19 +0000690 MAX = sys.maxsize
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000691 MASK = 2 * MAX + 1
692 n = len(self)
693 h = 1927868237 * (n + 1)
694 h &= MASK
695 for x in self:
696 hx = hash(x)
697 h ^= (hx ^ (hx << 16) ^ 89869747) * 3644798167
698 h &= MASK
Miss Islington (bot)4194f142021-07-21 17:23:21 -0700699 h ^= (h >> 11) ^ (h >> 25)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000700 h = h * 69069 + 907133923
701 h &= MASK
702 if h > MAX:
703 h -= MASK + 1
704 if h == -1:
705 h = 590923713
706 return h
707
Guido van Rossum48b069a2020-04-07 09:50:06 -0700708
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000709Set.register(frozenset)
710
711
712class MutableSet(Set):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700713 """A mutable set is a finite, iterable container.
714
715 This class provides concrete generic implementations of all
716 methods except for __contains__, __iter__, __len__,
717 add(), and discard().
718
719 To override the comparisons (presumably for speed, as the
720 semantics are fixed), all you have to do is redefine __le__ and
721 then the other operations will automatically follow suit.
722 """
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000723
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700724 __slots__ = ()
725
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000726 @abstractmethod
727 def add(self, value):
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000728 """Add an element."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000729 raise NotImplementedError
730
731 @abstractmethod
732 def discard(self, value):
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000733 """Remove an element. Do not raise an exception if absent."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000734 raise NotImplementedError
735
Christian Heimes190d79e2008-01-30 11:58:22 +0000736 def remove(self, value):
737 """Remove an element. If not a member, raise a KeyError."""
738 if value not in self:
739 raise KeyError(value)
740 self.discard(value)
741
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000742 def pop(self):
743 """Return the popped value. Raise KeyError if empty."""
744 it = iter(self)
745 try:
Raymond Hettingerae650182009-01-28 23:33:59 +0000746 value = next(it)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000747 except StopIteration:
Serhiy Storchaka5affd232017-04-05 09:37:24 +0300748 raise KeyError from None
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000749 self.discard(value)
750 return value
751
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000752 def clear(self):
753 """This is slow (creates N new iterators!) but effective."""
754 try:
755 while True:
756 self.pop()
757 except KeyError:
758 pass
759
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000760 def __ior__(self, it):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000761 for value in it:
762 self.add(value)
763 return self
764
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000765 def __iand__(self, it):
Raymond Hettinger3f10a952009-04-01 19:05:50 +0000766 for value in (self - it):
767 self.discard(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000768 return self
769
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000770 def __ixor__(self, it):
Daniel Stutzbach31da5b22010-08-24 20:49:57 +0000771 if it is self:
772 self.clear()
773 else:
774 if not isinstance(it, Set):
775 it = self._from_iterable(it)
776 for value in it:
777 if value in self:
778 self.discard(value)
779 else:
780 self.add(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000781 return self
782
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000783 def __isub__(self, it):
Daniel Stutzbach31da5b22010-08-24 20:49:57 +0000784 if it is self:
785 self.clear()
786 else:
787 for value in it:
788 self.discard(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000789 return self
790
Guido van Rossum48b069a2020-04-07 09:50:06 -0700791
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000792MutableSet.register(set)
793
794
795### MAPPINGS ###
796
Guido van Rossumf0666942016-08-23 10:47:07 -0700797class Mapping(Collection):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700798 """A Mapping is a generic container for associating key/value
799 pairs.
800
801 This class provides concrete generic implementations of all
802 methods except for __getitem__, __iter__, and __len__.
Raymond Hettinger153866e2013-03-24 15:20:29 -0700803 """
804
Julien Palard282282a2020-11-17 22:50:23 +0100805 __slots__ = ()
806
Mark Shannon069e81a2021-04-30 09:50:28 +0100807 # Tell ABCMeta.__new__ that this class should have TPFLAGS_MAPPING set.
808 __abc_tpflags__ = 1 << 6 # Py_TPFLAGS_MAPPING
809
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000810 @abstractmethod
811 def __getitem__(self, key):
812 raise KeyError
813
814 def get(self, key, default=None):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700815 'D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000816 try:
817 return self[key]
818 except KeyError:
819 return default
820
821 def __contains__(self, key):
822 try:
823 self[key]
824 except KeyError:
825 return False
826 else:
827 return True
828
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000829 def keys(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700830 "D.keys() -> a set-like object providing a view on D's keys"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000831 return KeysView(self)
832
833 def items(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700834 "D.items() -> a set-like object providing a view on D's items"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000835 return ItemsView(self)
836
837 def values(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700838 "D.values() -> an object providing a view on D's values"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000839 return ValuesView(self)
840
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000841 def __eq__(self, other):
Benjamin Peterson4ad6bd52010-05-21 20:55:22 +0000842 if not isinstance(other, Mapping):
843 return NotImplemented
844 return dict(self.items()) == dict(other.items())
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000845
Guido van Rossum97c1adf2016-08-18 09:22:23 -0700846 __reversed__ = None
847
Victor Stinner7b17a4e2012-04-20 01:41:36 +0200848Mapping.register(mappingproxy)
849
Christian Heimes2202f872008-02-06 14:31:34 +0000850
Raymond Hettingerbfd06122008-02-09 10:04:32 +0000851class MappingView(Sized):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000852
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700853 __slots__ = '_mapping',
854
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000855 def __init__(self, mapping):
856 self._mapping = mapping
857
858 def __len__(self):
859 return len(self._mapping)
860
Raymond Hettinger89fc2b72009-02-27 07:47:32 +0000861 def __repr__(self):
862 return '{0.__class__.__name__}({0._mapping!r})'.format(self)
863
Guido van Rossum48b069a2020-04-07 09:50:06 -0700864 __class_getitem__ = classmethod(GenericAlias)
865
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000866
867class KeysView(MappingView, Set):
868
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700869 __slots__ = ()
870
Raymond Hettinger9117c752010-08-22 07:44:24 +0000871 @classmethod
872 def _from_iterable(self, it):
873 return set(it)
874
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000875 def __contains__(self, key):
876 return key in self._mapping
877
878 def __iter__(self):
Philip Jenvey4993cc02012-10-01 12:53:43 -0700879 yield from self._mapping
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000880
Guido van Rossum48b069a2020-04-07 09:50:06 -0700881
Christian Heimesf83be4e2007-11-28 09:44:38 +0000882KeysView.register(dict_keys)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000883
884
885class ItemsView(MappingView, Set):
886
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700887 __slots__ = ()
888
Raymond Hettinger9117c752010-08-22 07:44:24 +0000889 @classmethod
890 def _from_iterable(self, it):
891 return set(it)
892
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000893 def __contains__(self, item):
894 key, value = item
895 try:
896 v = self._mapping[key]
897 except KeyError:
898 return False
899 else:
Raymond Hettinger584e8ae2016-05-05 11:14:06 +0300900 return v is value or v == value
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000901
902 def __iter__(self):
903 for key in self._mapping:
904 yield (key, self._mapping[key])
905
Guido van Rossum48b069a2020-04-07 09:50:06 -0700906
Christian Heimesf83be4e2007-11-28 09:44:38 +0000907ItemsView.register(dict_items)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000908
909
Raymond Hettinger02556fb2018-01-11 21:53:49 -0800910class ValuesView(MappingView, Collection):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000911
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700912 __slots__ = ()
913
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000914 def __contains__(self, value):
915 for key in self._mapping:
Raymond Hettinger584e8ae2016-05-05 11:14:06 +0300916 v = self._mapping[key]
917 if v is value or v == value:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000918 return True
919 return False
920
921 def __iter__(self):
922 for key in self._mapping:
923 yield self._mapping[key]
924
Guido van Rossum48b069a2020-04-07 09:50:06 -0700925
Christian Heimesf83be4e2007-11-28 09:44:38 +0000926ValuesView.register(dict_values)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000927
928
929class MutableMapping(Mapping):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700930 """A MutableMapping is a generic container for associating
931 key/value pairs.
932
933 This class provides concrete generic implementations of all
934 methods except for __getitem__, __setitem__, __delitem__,
935 __iter__, and __len__.
Raymond Hettinger153866e2013-03-24 15:20:29 -0700936 """
937
Julien Palard282282a2020-11-17 22:50:23 +0100938 __slots__ = ()
939
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000940 @abstractmethod
941 def __setitem__(self, key, value):
942 raise KeyError
943
944 @abstractmethod
945 def __delitem__(self, key):
946 raise KeyError
947
948 __marker = object()
949
950 def pop(self, key, default=__marker):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700951 '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
952 If key is not found, d is returned if given, otherwise KeyError is raised.
953 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000954 try:
955 value = self[key]
956 except KeyError:
957 if default is self.__marker:
958 raise
959 return default
960 else:
961 del self[key]
962 return value
963
964 def popitem(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700965 '''D.popitem() -> (k, v), remove and return some (key, value) pair
966 as a 2-tuple; but raise KeyError if D is empty.
967 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000968 try:
969 key = next(iter(self))
970 except StopIteration:
Serhiy Storchaka5affd232017-04-05 09:37:24 +0300971 raise KeyError from None
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000972 value = self[key]
973 del self[key]
974 return key, value
975
976 def clear(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700977 'D.clear() -> None. Remove all items from D.'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000978 try:
979 while True:
980 self.popitem()
981 except KeyError:
982 pass
983
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300984 def update(self, other=(), /, **kwds):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700985 ''' D.update([E, ]**F) -> None. Update D from mapping/iterable E and F.
986 If E present and has a .keys() method, does: for k in E: D[k] = E[k]
987 If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v
988 In either case, this is followed by: for k, v in F.items(): D[k] = v
989 '''
Serhiy Storchaka2085bd02019-06-01 11:00:15 +0300990 if isinstance(other, Mapping):
991 for key in other:
992 self[key] = other[key]
993 elif hasattr(other, "keys"):
994 for key in other.keys():
995 self[key] = other[key]
996 else:
997 for key, value in other:
998 self[key] = value
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000999 for key, value in kwds.items():
1000 self[key] = value
1001
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +00001002 def setdefault(self, key, default=None):
Raymond Hettinger153866e2013-03-24 15:20:29 -07001003 'D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D'
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +00001004 try:
1005 return self[key]
1006 except KeyError:
1007 self[key] = default
1008 return default
1009
Guido van Rossum48b069a2020-04-07 09:50:06 -07001010
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001011MutableMapping.register(dict)
1012
1013
1014### SEQUENCES ###
1015
Guido van Rossumf0666942016-08-23 10:47:07 -07001016class Sequence(Reversible, Collection):
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001017 """All the operations on a read-only sequence.
1018
1019 Concrete subclasses must override __new__ or __init__,
1020 __getitem__, and __len__.
1021 """
1022
Raymond Hettingerc46759a2011-03-22 11:46:25 -07001023 __slots__ = ()
1024
Mark Shannon069e81a2021-04-30 09:50:28 +01001025 # Tell ABCMeta.__new__ that this class should have TPFLAGS_SEQUENCE set.
1026 __abc_tpflags__ = 1 << 5 # Py_TPFLAGS_SEQUENCE
1027
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001028 @abstractmethod
1029 def __getitem__(self, index):
1030 raise IndexError
1031
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001032 def __iter__(self):
1033 i = 0
Raymond Hettinger71909422008-02-09 00:08:16 +00001034 try:
1035 while True:
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001036 v = self[i]
Raymond Hettinger71909422008-02-09 00:08:16 +00001037 yield v
1038 i += 1
1039 except IndexError:
1040 return
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001041
1042 def __contains__(self, value):
1043 for v in self:
Raymond Hettinger584e8ae2016-05-05 11:14:06 +03001044 if v is value or v == value:
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001045 return True
1046 return False
1047
1048 def __reversed__(self):
1049 for i in reversed(range(len(self))):
1050 yield self[i]
1051
Raymond Hettingerec219ba2015-05-22 19:29:22 -07001052 def index(self, value, start=0, stop=None):
1053 '''S.index(value, [start, [stop]]) -> integer -- return first index of value.
Raymond Hettinger153866e2013-03-24 15:20:29 -07001054 Raises ValueError if the value is not present.
Nitish Chandra5ce0a2a2017-12-12 15:52:30 +05301055
1056 Supporting start and stop arguments is optional, but
1057 recommended.
Raymond Hettinger153866e2013-03-24 15:20:29 -07001058 '''
Raymond Hettingerec219ba2015-05-22 19:29:22 -07001059 if start is not None and start < 0:
1060 start = max(len(self) + start, 0)
1061 if stop is not None and stop < 0:
1062 stop += len(self)
1063
1064 i = start
1065 while stop is None or i < stop:
1066 try:
Xiang Zhangd5d32492017-03-08 11:04:24 +08001067 v = self[i]
1068 if v is value or v == value:
Raymond Hettingerec219ba2015-05-22 19:29:22 -07001069 return i
1070 except IndexError:
1071 break
1072 i += 1
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001073 raise ValueError
1074
1075 def count(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -07001076 'S.count(value) -> integer -- return number of occurrences of value'
Xiang Zhangd5d32492017-03-08 11:04:24 +08001077 return sum(1 for v in self if v is value or v == value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001078
1079Sequence.register(tuple)
Guido van Rossum3172c5d2007-10-16 18:12:55 +00001080Sequence.register(str)
Raymond Hettinger9aa53c22009-02-24 11:25:35 +00001081Sequence.register(range)
Nick Coghlan45163cc2013-10-02 22:31:47 +10001082Sequence.register(memoryview)
Guido van Rossumd05eb002007-11-21 22:26:24 +00001083
1084
1085class ByteString(Sequence):
Guido van Rossumd05eb002007-11-21 22:26:24 +00001086 """This unifies bytes and bytearray.
1087
1088 XXX Should add all their methods.
1089 """
1090
Raymond Hettingerc46759a2011-03-22 11:46:25 -07001091 __slots__ = ()
1092
Guido van Rossumd05eb002007-11-21 22:26:24 +00001093ByteString.register(bytes)
1094ByteString.register(bytearray)
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001095
1096
1097class MutableSequence(Sequence):
Guido van Rossum840c3102013-07-25 11:55:41 -07001098 """All the operations on a read-write sequence.
Raymond Hettinger153866e2013-03-24 15:20:29 -07001099
1100 Concrete subclasses must provide __new__ or __init__,
1101 __getitem__, __setitem__, __delitem__, __len__, and insert().
Raymond Hettinger153866e2013-03-24 15:20:29 -07001102 """
1103
Julien Palard282282a2020-11-17 22:50:23 +01001104 __slots__ = ()
1105
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001106 @abstractmethod
1107 def __setitem__(self, index, value):
1108 raise IndexError
1109
1110 @abstractmethod
1111 def __delitem__(self, index):
1112 raise IndexError
1113
1114 @abstractmethod
1115 def insert(self, index, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -07001116 'S.insert(index, value) -- insert value before index'
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001117 raise IndexError
1118
1119 def append(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -07001120 'S.append(value) -- append value to the end of the sequence'
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001121 self.insert(len(self), value)
1122
Eli Bendersky9479d1a2011-03-04 05:34:58 +00001123 def clear(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -07001124 'S.clear() -> None -- remove all items from S'
Eli Bendersky9479d1a2011-03-04 05:34:58 +00001125 try:
1126 while True:
1127 self.pop()
1128 except IndexError:
1129 pass
1130
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001131 def reverse(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -07001132 'S.reverse() -- reverse *IN PLACE*'
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001133 n = len(self)
1134 for i in range(n//2):
1135 self[i], self[n-i-1] = self[n-i-1], self[i]
1136
1137 def extend(self, values):
Raymond Hettinger153866e2013-03-24 15:20:29 -07001138 'S.extend(iterable) -- extend sequence by appending elements from the iterable'
Naris R1b5f9c92018-08-31 02:56:14 +10001139 if values is self:
1140 values = list(values)
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001141 for v in values:
1142 self.append(v)
1143
1144 def pop(self, index=-1):
Raymond Hettinger153866e2013-03-24 15:20:29 -07001145 '''S.pop([index]) -> item -- remove and return item at index (default last).
1146 Raise IndexError if list is empty or index is out of range.
1147 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001148 v = self[index]
1149 del self[index]
1150 return v
1151
1152 def remove(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -07001153 '''S.remove(value) -- remove first occurrence of value.
1154 Raise ValueError if the value is not present.
1155 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001156 del self[self.index(value)]
1157
1158 def __iadd__(self, values):
1159 self.extend(values)
Raymond Hettingerc384b222009-05-18 15:35:26 +00001160 return self
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001161
Guido van Rossum48b069a2020-04-07 09:50:06 -07001162
Guido van Rossumcd16bf62007-06-13 18:07:49 +00001163MutableSequence.register(list)
Guido van Rossumd05eb002007-11-21 22:26:24 +00001164MutableSequence.register(bytearray) # Multiply inheriting, see ByteString