blob: 3d3f07b92ef32636cb3067d60cad2fa4af249055 [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
12__all__ = ["Hashable", "Iterable", "Iterator",
13 "Sized", "Container", "Callable",
14 "Set", "MutableSet",
15 "Mapping", "MutableMapping",
16 "MappingView", "KeysView", "ItemsView", "ValuesView",
17 "Sequence", "MutableSequence",
Guido van Rossumd05eb002007-11-21 22:26:24 +000018 "ByteString",
Guido van Rossumcd16bf62007-06-13 18:07:49 +000019 ]
20
Christian Heimesbf235bd2013-10-13 02:21:33 +020021# This module has been renamed from collections.abc to _collections_abc to
22# speed up interpreter startup. Some of the types such as MutableMapping are
23# required early but collections module imports a lot of other modules.
24# See issue #19218
25__name__ = "collections.abc"
26
Raymond Hettinger02184282012-04-05 13:31:12 -070027# Private list of types that we want to register with the various ABCs
28# so that they will pass tests like:
29# it = iter(somebytearray)
30# assert isinstance(it, Iterable)
31# Note: in other implementations, these types many not be distinct
32# and they make have their own implementation specific types that
33# are not included on this list.
Christian Heimesf83be4e2007-11-28 09:44:38 +000034bytes_iterator = type(iter(b''))
35bytearray_iterator = type(iter(bytearray()))
36#callable_iterator = ???
37dict_keyiterator = type(iter({}.keys()))
38dict_valueiterator = type(iter({}.values()))
39dict_itemiterator = type(iter({}.items()))
40list_iterator = type(iter([]))
41list_reverseiterator = type(iter(reversed([])))
42range_iterator = type(iter(range(0)))
43set_iterator = type(iter(set()))
44str_iterator = type(iter(""))
45tuple_iterator = type(iter(()))
46zip_iterator = type(iter(zip()))
47## views ##
48dict_keys = type({}.keys())
49dict_values = type({}.values())
50dict_items = type({}.items())
Christian Heimes0db38532007-11-29 16:21:13 +000051## misc ##
Victor Stinner7b17a4e2012-04-20 01:41:36 +020052mappingproxy = type(type.__dict__)
Christian Heimesf83be4e2007-11-28 09:44:38 +000053
54
Guido van Rossumcd16bf62007-06-13 18:07:49 +000055### ONE-TRICK PONIES ###
56
57class Hashable(metaclass=ABCMeta):
58
Raymond Hettingerc46759a2011-03-22 11:46:25 -070059 __slots__ = ()
60
Guido van Rossumcd16bf62007-06-13 18:07:49 +000061 @abstractmethod
62 def __hash__(self):
63 return 0
64
65 @classmethod
66 def __subclasshook__(cls, C):
67 if cls is Hashable:
68 for B in C.__mro__:
69 if "__hash__" in B.__dict__:
70 if B.__dict__["__hash__"]:
71 return True
72 break
73 return NotImplemented
74
75
76class Iterable(metaclass=ABCMeta):
77
Raymond Hettingerc46759a2011-03-22 11:46:25 -070078 __slots__ = ()
79
Guido van Rossumcd16bf62007-06-13 18:07:49 +000080 @abstractmethod
81 def __iter__(self):
82 while False:
83 yield None
84
85 @classmethod
86 def __subclasshook__(cls, C):
87 if cls is Iterable:
88 if any("__iter__" in B.__dict__ for B in C.__mro__):
89 return True
90 return NotImplemented
91
Guido van Rossumcd16bf62007-06-13 18:07:49 +000092
Raymond Hettinger74b64952008-02-09 02:53:48 +000093class Iterator(Iterable):
Guido van Rossumcd16bf62007-06-13 18:07:49 +000094
Raymond Hettingerc46759a2011-03-22 11:46:25 -070095 __slots__ = ()
96
Guido van Rossumcd16bf62007-06-13 18:07:49 +000097 @abstractmethod
98 def __next__(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -070099 'Return the next item from the iterator. When exhausted, raise StopIteration'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000100 raise StopIteration
101
102 def __iter__(self):
103 return self
104
105 @classmethod
106 def __subclasshook__(cls, C):
107 if cls is Iterator:
Raymond Hettingeread22222010-11-29 03:56:12 +0000108 if (any("__next__" in B.__dict__ for B in C.__mro__) and
109 any("__iter__" in B.__dict__ for B in C.__mro__)):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000110 return True
111 return NotImplemented
112
Christian Heimesf83be4e2007-11-28 09:44:38 +0000113Iterator.register(bytes_iterator)
114Iterator.register(bytearray_iterator)
115#Iterator.register(callable_iterator)
116Iterator.register(dict_keyiterator)
117Iterator.register(dict_valueiterator)
118Iterator.register(dict_itemiterator)
119Iterator.register(list_iterator)
120Iterator.register(list_reverseiterator)
121Iterator.register(range_iterator)
122Iterator.register(set_iterator)
123Iterator.register(str_iterator)
124Iterator.register(tuple_iterator)
125Iterator.register(zip_iterator)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000126
127class Sized(metaclass=ABCMeta):
128
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700129 __slots__ = ()
130
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000131 @abstractmethod
132 def __len__(self):
133 return 0
134
135 @classmethod
136 def __subclasshook__(cls, C):
137 if cls is Sized:
138 if any("__len__" in B.__dict__ for B in C.__mro__):
139 return True
140 return NotImplemented
141
142
143class Container(metaclass=ABCMeta):
144
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700145 __slots__ = ()
146
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000147 @abstractmethod
148 def __contains__(self, x):
149 return False
150
151 @classmethod
152 def __subclasshook__(cls, C):
153 if cls is Container:
154 if any("__contains__" in B.__dict__ for B in C.__mro__):
155 return True
156 return NotImplemented
157
158
159class Callable(metaclass=ABCMeta):
160
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700161 __slots__ = ()
162
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000163 @abstractmethod
Christian Heimes78644762008-03-04 23:39:23 +0000164 def __call__(self, *args, **kwds):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000165 return False
166
167 @classmethod
168 def __subclasshook__(cls, C):
169 if cls is Callable:
170 if any("__call__" in B.__dict__ for B in C.__mro__):
171 return True
172 return NotImplemented
173
174
175### SETS ###
176
177
Raymond Hettinger74b64952008-02-09 02:53:48 +0000178class Set(Sized, Iterable, Container):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000179
180 """A set is a finite, iterable container.
181
182 This class provides concrete generic implementations of all
183 methods except for __contains__, __iter__ and __len__.
184
185 To override the comparisons (presumably for speed, as the
Raymond Hettinger11cda472014-07-03 00:31:30 +0100186 semantics are fixed), redefine __le__ and __ge__,
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000187 then the other operations will automatically follow suit.
188 """
189
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700190 __slots__ = ()
191
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000192 def __le__(self, other):
193 if not isinstance(other, Set):
194 return NotImplemented
195 if len(self) > len(other):
196 return False
197 for elem in self:
198 if elem not in other:
199 return False
200 return True
201
202 def __lt__(self, other):
203 if not isinstance(other, Set):
204 return NotImplemented
205 return len(self) < len(other) and self.__le__(other)
206
Raymond Hettinger71909422008-02-09 00:08:16 +0000207 def __gt__(self, other):
208 if not isinstance(other, Set):
209 return NotImplemented
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700210 return len(self) > len(other) and self.__ge__(other)
Raymond Hettinger71909422008-02-09 00:08:16 +0000211
212 def __ge__(self, other):
213 if not isinstance(other, Set):
214 return NotImplemented
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700215 if len(self) < len(other):
216 return False
217 for elem in other:
218 if elem not in self:
219 return False
220 return True
Raymond Hettinger71909422008-02-09 00:08:16 +0000221
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000222 def __eq__(self, other):
223 if not isinstance(other, Set):
224 return NotImplemented
225 return len(self) == len(other) and self.__le__(other)
226
227 @classmethod
228 def _from_iterable(cls, it):
Raymond Hettinger8284c4a2008-02-06 20:47:09 +0000229 '''Construct an instance of the class from any iterable input.
230
231 Must override this method if the class constructor signature
Raymond Hettinger7aebb642008-02-09 03:25:08 +0000232 does not accept an iterable for an input.
Raymond Hettinger8284c4a2008-02-06 20:47:09 +0000233 '''
Raymond Hettinger7aebb642008-02-09 03:25:08 +0000234 return cls(it)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000235
236 def __and__(self, other):
237 if not isinstance(other, Iterable):
238 return NotImplemented
239 return self._from_iterable(value for value in other if value in self)
240
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700241 __rand__ = __and__
242
Christian Heimes190d79e2008-01-30 11:58:22 +0000243 def isdisjoint(self, other):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700244 'Return True if two sets have a null intersection.'
Christian Heimes190d79e2008-01-30 11:58:22 +0000245 for value in other:
246 if value in self:
247 return False
248 return True
249
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000250 def __or__(self, other):
251 if not isinstance(other, Iterable):
252 return NotImplemented
Christian Heimes78644762008-03-04 23:39:23 +0000253 chain = (e for s in (self, other) for e in s)
254 return self._from_iterable(chain)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000255
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700256 __ror__ = __or__
257
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000258 def __sub__(self, other):
259 if not isinstance(other, Set):
260 if not isinstance(other, Iterable):
261 return NotImplemented
262 other = self._from_iterable(other)
263 return self._from_iterable(value for value in self
264 if value not in other)
265
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700266 def __rsub__(self, other):
267 if not isinstance(other, Set):
268 if not isinstance(other, Iterable):
269 return NotImplemented
270 other = self._from_iterable(other)
271 return self._from_iterable(value for value in other
272 if value not in self)
273
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000274 def __xor__(self, other):
275 if not isinstance(other, Set):
276 if not isinstance(other, Iterable):
277 return NotImplemented
278 other = self._from_iterable(other)
279 return (self - other) | (other - self)
280
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700281 __rxor__ = __xor__
282
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000283 def _hash(self):
284 """Compute the hash value of a set.
285
286 Note that we don't define __hash__: not all sets are hashable.
287 But if you define a hashable set type, its __hash__ should
288 call this function.
289
290 This must be compatible __eq__.
291
292 All sets ought to compare equal if they contain the same
293 elements, regardless of how they are implemented, and
294 regardless of the order of the elements; so there's not much
295 freedom for __eq__ or __hash__. We match the algorithm used
296 by the built-in frozenset type.
297 """
Christian Heimesa37d4c62007-12-04 23:02:19 +0000298 MAX = sys.maxsize
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000299 MASK = 2 * MAX + 1
300 n = len(self)
301 h = 1927868237 * (n + 1)
302 h &= MASK
303 for x in self:
304 hx = hash(x)
305 h ^= (hx ^ (hx << 16) ^ 89869747) * 3644798167
306 h &= MASK
307 h = h * 69069 + 907133923
308 h &= MASK
309 if h > MAX:
310 h -= MASK + 1
311 if h == -1:
312 h = 590923713
313 return h
314
315Set.register(frozenset)
316
317
318class MutableSet(Set):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700319 """A mutable set is a finite, iterable container.
320
321 This class provides concrete generic implementations of all
322 methods except for __contains__, __iter__, __len__,
323 add(), and discard().
324
325 To override the comparisons (presumably for speed, as the
326 semantics are fixed), all you have to do is redefine __le__ and
327 then the other operations will automatically follow suit.
328 """
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000329
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700330 __slots__ = ()
331
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000332 @abstractmethod
333 def add(self, value):
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000334 """Add an element."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000335 raise NotImplementedError
336
337 @abstractmethod
338 def discard(self, value):
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000339 """Remove an element. Do not raise an exception if absent."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000340 raise NotImplementedError
341
Christian Heimes190d79e2008-01-30 11:58:22 +0000342 def remove(self, value):
343 """Remove an element. If not a member, raise a KeyError."""
344 if value not in self:
345 raise KeyError(value)
346 self.discard(value)
347
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000348 def pop(self):
349 """Return the popped value. Raise KeyError if empty."""
350 it = iter(self)
351 try:
Raymond Hettingerae650182009-01-28 23:33:59 +0000352 value = next(it)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000353 except StopIteration:
354 raise KeyError
355 self.discard(value)
356 return value
357
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000358 def clear(self):
359 """This is slow (creates N new iterators!) but effective."""
360 try:
361 while True:
362 self.pop()
363 except KeyError:
364 pass
365
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000366 def __ior__(self, it):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000367 for value in it:
368 self.add(value)
369 return self
370
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000371 def __iand__(self, it):
Raymond Hettinger3f10a952009-04-01 19:05:50 +0000372 for value in (self - it):
373 self.discard(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000374 return self
375
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000376 def __ixor__(self, it):
Daniel Stutzbach31da5b22010-08-24 20:49:57 +0000377 if it is self:
378 self.clear()
379 else:
380 if not isinstance(it, Set):
381 it = self._from_iterable(it)
382 for value in it:
383 if value in self:
384 self.discard(value)
385 else:
386 self.add(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000387 return self
388
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000389 def __isub__(self, it):
Daniel Stutzbach31da5b22010-08-24 20:49:57 +0000390 if it is self:
391 self.clear()
392 else:
393 for value in it:
394 self.discard(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000395 return self
396
397MutableSet.register(set)
398
399
400### MAPPINGS ###
401
402
Raymond Hettinger74b64952008-02-09 02:53:48 +0000403class Mapping(Sized, Iterable, Container):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000404
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700405 __slots__ = ()
406
Raymond Hettinger153866e2013-03-24 15:20:29 -0700407 """A Mapping is a generic container for associating key/value
408 pairs.
409
410 This class provides concrete generic implementations of all
411 methods except for __getitem__, __iter__, and __len__.
412
413 """
414
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000415 @abstractmethod
416 def __getitem__(self, key):
417 raise KeyError
418
419 def get(self, key, default=None):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700420 'D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000421 try:
422 return self[key]
423 except KeyError:
424 return default
425
426 def __contains__(self, key):
427 try:
428 self[key]
429 except KeyError:
430 return False
431 else:
432 return True
433
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000434 def keys(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700435 "D.keys() -> a set-like object providing a view on D's keys"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000436 return KeysView(self)
437
438 def items(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700439 "D.items() -> a set-like object providing a view on D's items"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000440 return ItemsView(self)
441
442 def values(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700443 "D.values() -> an object providing a view on D's values"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000444 return ValuesView(self)
445
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000446 def __eq__(self, other):
Benjamin Peterson4ad6bd52010-05-21 20:55:22 +0000447 if not isinstance(other, Mapping):
448 return NotImplemented
449 return dict(self.items()) == dict(other.items())
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000450
Victor Stinner7b17a4e2012-04-20 01:41:36 +0200451Mapping.register(mappingproxy)
452
Christian Heimes2202f872008-02-06 14:31:34 +0000453
Raymond Hettingerbfd06122008-02-09 10:04:32 +0000454class MappingView(Sized):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000455
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700456 __slots__ = '_mapping',
457
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000458 def __init__(self, mapping):
459 self._mapping = mapping
460
461 def __len__(self):
462 return len(self._mapping)
463
Raymond Hettinger89fc2b72009-02-27 07:47:32 +0000464 def __repr__(self):
465 return '{0.__class__.__name__}({0._mapping!r})'.format(self)
466
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000467
468class KeysView(MappingView, Set):
469
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700470 __slots__ = ()
471
Raymond Hettinger9117c752010-08-22 07:44:24 +0000472 @classmethod
473 def _from_iterable(self, it):
474 return set(it)
475
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000476 def __contains__(self, key):
477 return key in self._mapping
478
479 def __iter__(self):
Philip Jenvey4993cc02012-10-01 12:53:43 -0700480 yield from self._mapping
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000481
Christian Heimesf83be4e2007-11-28 09:44:38 +0000482KeysView.register(dict_keys)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000483
484
485class ItemsView(MappingView, Set):
486
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700487 __slots__ = ()
488
Raymond Hettinger9117c752010-08-22 07:44:24 +0000489 @classmethod
490 def _from_iterable(self, it):
491 return set(it)
492
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000493 def __contains__(self, item):
494 key, value = item
495 try:
496 v = self._mapping[key]
497 except KeyError:
498 return False
499 else:
500 return v == value
501
502 def __iter__(self):
503 for key in self._mapping:
504 yield (key, self._mapping[key])
505
Christian Heimesf83be4e2007-11-28 09:44:38 +0000506ItemsView.register(dict_items)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000507
508
509class ValuesView(MappingView):
510
Raymond Hettinger3170d1c2014-05-03 19:06:32 -0700511 __slots__ = ()
512
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000513 def __contains__(self, value):
514 for key in self._mapping:
515 if value == self._mapping[key]:
516 return True
517 return False
518
519 def __iter__(self):
520 for key in self._mapping:
521 yield self._mapping[key]
522
Christian Heimesf83be4e2007-11-28 09:44:38 +0000523ValuesView.register(dict_values)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000524
525
526class MutableMapping(Mapping):
527
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700528 __slots__ = ()
529
Raymond Hettinger153866e2013-03-24 15:20:29 -0700530 """A MutableMapping is a generic container for associating
531 key/value pairs.
532
533 This class provides concrete generic implementations of all
534 methods except for __getitem__, __setitem__, __delitem__,
535 __iter__, and __len__.
536
537 """
538
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000539 @abstractmethod
540 def __setitem__(self, key, value):
541 raise KeyError
542
543 @abstractmethod
544 def __delitem__(self, key):
545 raise KeyError
546
547 __marker = object()
548
549 def pop(self, key, default=__marker):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700550 '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
551 If key is not found, d is returned if given, otherwise KeyError is raised.
552 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000553 try:
554 value = self[key]
555 except KeyError:
556 if default is self.__marker:
557 raise
558 return default
559 else:
560 del self[key]
561 return value
562
563 def popitem(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700564 '''D.popitem() -> (k, v), remove and return some (key, value) pair
565 as a 2-tuple; but raise KeyError if D is empty.
566 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000567 try:
568 key = next(iter(self))
569 except StopIteration:
570 raise KeyError
571 value = self[key]
572 del self[key]
573 return key, value
574
575 def clear(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700576 'D.clear() -> None. Remove all items from D.'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000577 try:
578 while True:
579 self.popitem()
580 except KeyError:
581 pass
582
Mark Dickinsonb214e902010-07-11 18:53:06 +0000583 def update(*args, **kwds):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700584 ''' D.update([E, ]**F) -> None. Update D from mapping/iterable E and F.
585 If E present and has a .keys() method, does: for k in E: D[k] = E[k]
586 If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v
587 In either case, this is followed by: for k, v in F.items(): D[k] = v
588 '''
Serhiy Storchakaae5cb212014-11-27 16:25:51 +0200589 if not args:
590 raise TypeError("descriptor 'update' of 'MutableMapping' object "
591 "needs an argument")
592 self, *args = args
593 if len(args) > 1:
594 raise TypeError('update expected at most 1 arguments, got %d' %
595 len(args))
596 if args:
597 other = args[0]
598 if isinstance(other, Mapping):
599 for key in other:
600 self[key] = other[key]
601 elif hasattr(other, "keys"):
602 for key in other.keys():
603 self[key] = other[key]
604 else:
605 for key, value in other:
606 self[key] = value
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000607 for key, value in kwds.items():
608 self[key] = value
609
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000610 def setdefault(self, key, default=None):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700611 '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 +0000612 try:
613 return self[key]
614 except KeyError:
615 self[key] = default
616 return default
617
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000618MutableMapping.register(dict)
619
620
621### SEQUENCES ###
622
623
Raymond Hettinger74b64952008-02-09 02:53:48 +0000624class Sequence(Sized, Iterable, Container):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000625
626 """All the operations on a read-only sequence.
627
628 Concrete subclasses must override __new__ or __init__,
629 __getitem__, and __len__.
630 """
631
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700632 __slots__ = ()
633
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000634 @abstractmethod
635 def __getitem__(self, index):
636 raise IndexError
637
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000638 def __iter__(self):
639 i = 0
Raymond Hettinger71909422008-02-09 00:08:16 +0000640 try:
641 while True:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000642 v = self[i]
Raymond Hettinger71909422008-02-09 00:08:16 +0000643 yield v
644 i += 1
645 except IndexError:
646 return
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000647
648 def __contains__(self, value):
649 for v in self:
650 if v == value:
651 return True
652 return False
653
654 def __reversed__(self):
655 for i in reversed(range(len(self))):
656 yield self[i]
657
658 def index(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700659 '''S.index(value) -> integer -- return first index of value.
660 Raises ValueError if the value is not present.
661 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000662 for i, v in enumerate(self):
663 if v == value:
664 return i
665 raise ValueError
666
667 def count(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700668 'S.count(value) -> integer -- return number of occurrences of value'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000669 return sum(1 for v in self if v == value)
670
671Sequence.register(tuple)
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000672Sequence.register(str)
Raymond Hettinger9aa53c22009-02-24 11:25:35 +0000673Sequence.register(range)
Nick Coghlan45163cc2013-10-02 22:31:47 +1000674Sequence.register(memoryview)
Guido van Rossumd05eb002007-11-21 22:26:24 +0000675
676
677class ByteString(Sequence):
678
679 """This unifies bytes and bytearray.
680
681 XXX Should add all their methods.
682 """
683
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700684 __slots__ = ()
685
Guido van Rossumd05eb002007-11-21 22:26:24 +0000686ByteString.register(bytes)
687ByteString.register(bytearray)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000688
689
690class MutableSequence(Sequence):
691
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700692 __slots__ = ()
693
Guido van Rossum840c3102013-07-25 11:55:41 -0700694 """All the operations on a read-write sequence.
Raymond Hettinger153866e2013-03-24 15:20:29 -0700695
696 Concrete subclasses must provide __new__ or __init__,
697 __getitem__, __setitem__, __delitem__, __len__, and insert().
698
699 """
700
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000701 @abstractmethod
702 def __setitem__(self, index, value):
703 raise IndexError
704
705 @abstractmethod
706 def __delitem__(self, index):
707 raise IndexError
708
709 @abstractmethod
710 def insert(self, index, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700711 'S.insert(index, value) -- insert value before index'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000712 raise IndexError
713
714 def append(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700715 'S.append(value) -- append value to the end of the sequence'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000716 self.insert(len(self), value)
717
Eli Bendersky9479d1a2011-03-04 05:34:58 +0000718 def clear(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700719 'S.clear() -> None -- remove all items from S'
Eli Bendersky9479d1a2011-03-04 05:34:58 +0000720 try:
721 while True:
722 self.pop()
723 except IndexError:
724 pass
725
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000726 def reverse(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700727 'S.reverse() -- reverse *IN PLACE*'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000728 n = len(self)
729 for i in range(n//2):
730 self[i], self[n-i-1] = self[n-i-1], self[i]
731
732 def extend(self, values):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700733 'S.extend(iterable) -- extend sequence by appending elements from the iterable'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000734 for v in values:
735 self.append(v)
736
737 def pop(self, index=-1):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700738 '''S.pop([index]) -> item -- remove and return item at index (default last).
739 Raise IndexError if list is empty or index is out of range.
740 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000741 v = self[index]
742 del self[index]
743 return v
744
745 def remove(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700746 '''S.remove(value) -- remove first occurrence of value.
747 Raise ValueError if the value is not present.
748 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000749 del self[self.index(value)]
750
751 def __iadd__(self, values):
752 self.extend(values)
Raymond Hettingerc384b222009-05-18 15:35:26 +0000753 return self
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000754
755MutableSequence.register(list)
Guido van Rossumd05eb002007-11-21 22:26:24 +0000756MutableSequence.register(bytearray) # Multiply inheriting, see ByteString