blob: 647744491d45174a42a8af1c1e6658a88c7e7747 [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
Raymond Hettinger71909422008-02-09 00:08:16 +0000227 def __ne__(self, other):
228 return not (self == other)
229
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000230 @classmethod
231 def _from_iterable(cls, it):
Raymond Hettinger8284c4a2008-02-06 20:47:09 +0000232 '''Construct an instance of the class from any iterable input.
233
234 Must override this method if the class constructor signature
Raymond Hettinger7aebb642008-02-09 03:25:08 +0000235 does not accept an iterable for an input.
Raymond Hettinger8284c4a2008-02-06 20:47:09 +0000236 '''
Raymond Hettinger7aebb642008-02-09 03:25:08 +0000237 return cls(it)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000238
239 def __and__(self, other):
240 if not isinstance(other, Iterable):
241 return NotImplemented
242 return self._from_iterable(value for value in other if value in self)
243
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700244 __rand__ = __and__
245
Christian Heimes190d79e2008-01-30 11:58:22 +0000246 def isdisjoint(self, other):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700247 'Return True if two sets have a null intersection.'
Christian Heimes190d79e2008-01-30 11:58:22 +0000248 for value in other:
249 if value in self:
250 return False
251 return True
252
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000253 def __or__(self, other):
254 if not isinstance(other, Iterable):
255 return NotImplemented
Christian Heimes78644762008-03-04 23:39:23 +0000256 chain = (e for s in (self, other) for e in s)
257 return self._from_iterable(chain)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000258
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700259 __ror__ = __or__
260
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000261 def __sub__(self, other):
262 if not isinstance(other, Set):
263 if not isinstance(other, Iterable):
264 return NotImplemented
265 other = self._from_iterable(other)
266 return self._from_iterable(value for value in self
267 if value not in other)
268
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700269 def __rsub__(self, other):
270 if not isinstance(other, Set):
271 if not isinstance(other, Iterable):
272 return NotImplemented
273 other = self._from_iterable(other)
274 return self._from_iterable(value for value in other
275 if value not in self)
276
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000277 def __xor__(self, other):
278 if not isinstance(other, Set):
279 if not isinstance(other, Iterable):
280 return NotImplemented
281 other = self._from_iterable(other)
282 return (self - other) | (other - self)
283
Raymond Hettingerdd5e53a2014-05-26 00:09:04 -0700284 __rxor__ = __xor__
285
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000286 def _hash(self):
287 """Compute the hash value of a set.
288
289 Note that we don't define __hash__: not all sets are hashable.
290 But if you define a hashable set type, its __hash__ should
291 call this function.
292
293 This must be compatible __eq__.
294
295 All sets ought to compare equal if they contain the same
296 elements, regardless of how they are implemented, and
297 regardless of the order of the elements; so there's not much
298 freedom for __eq__ or __hash__. We match the algorithm used
299 by the built-in frozenset type.
300 """
Christian Heimesa37d4c62007-12-04 23:02:19 +0000301 MAX = sys.maxsize
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000302 MASK = 2 * MAX + 1
303 n = len(self)
304 h = 1927868237 * (n + 1)
305 h &= MASK
306 for x in self:
307 hx = hash(x)
308 h ^= (hx ^ (hx << 16) ^ 89869747) * 3644798167
309 h &= MASK
310 h = h * 69069 + 907133923
311 h &= MASK
312 if h > MAX:
313 h -= MASK + 1
314 if h == -1:
315 h = 590923713
316 return h
317
318Set.register(frozenset)
319
320
321class MutableSet(Set):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700322 """A mutable set is a finite, iterable container.
323
324 This class provides concrete generic implementations of all
325 methods except for __contains__, __iter__, __len__,
326 add(), and discard().
327
328 To override the comparisons (presumably for speed, as the
329 semantics are fixed), all you have to do is redefine __le__ and
330 then the other operations will automatically follow suit.
331 """
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000332
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700333 __slots__ = ()
334
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000335 @abstractmethod
336 def add(self, value):
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000337 """Add an element."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000338 raise NotImplementedError
339
340 @abstractmethod
341 def discard(self, value):
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000342 """Remove an element. Do not raise an exception if absent."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000343 raise NotImplementedError
344
Christian Heimes190d79e2008-01-30 11:58:22 +0000345 def remove(self, value):
346 """Remove an element. If not a member, raise a KeyError."""
347 if value not in self:
348 raise KeyError(value)
349 self.discard(value)
350
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000351 def pop(self):
352 """Return the popped value. Raise KeyError if empty."""
353 it = iter(self)
354 try:
Raymond Hettingerae650182009-01-28 23:33:59 +0000355 value = next(it)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000356 except StopIteration:
357 raise KeyError
358 self.discard(value)
359 return value
360
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000361 def clear(self):
362 """This is slow (creates N new iterators!) but effective."""
363 try:
364 while True:
365 self.pop()
366 except KeyError:
367 pass
368
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000369 def __ior__(self, it):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000370 for value in it:
371 self.add(value)
372 return self
373
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000374 def __iand__(self, it):
Raymond Hettinger3f10a952009-04-01 19:05:50 +0000375 for value in (self - it):
376 self.discard(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000377 return self
378
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000379 def __ixor__(self, it):
Daniel Stutzbach31da5b22010-08-24 20:49:57 +0000380 if it is self:
381 self.clear()
382 else:
383 if not isinstance(it, Set):
384 it = self._from_iterable(it)
385 for value in it:
386 if value in self:
387 self.discard(value)
388 else:
389 self.add(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000390 return self
391
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000392 def __isub__(self, it):
Daniel Stutzbach31da5b22010-08-24 20:49:57 +0000393 if it is self:
394 self.clear()
395 else:
396 for value in it:
397 self.discard(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000398 return self
399
400MutableSet.register(set)
401
402
403### MAPPINGS ###
404
405
Raymond Hettinger74b64952008-02-09 02:53:48 +0000406class Mapping(Sized, Iterable, Container):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000407
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700408 __slots__ = ()
409
Raymond Hettinger153866e2013-03-24 15:20:29 -0700410 """A Mapping is a generic container for associating key/value
411 pairs.
412
413 This class provides concrete generic implementations of all
414 methods except for __getitem__, __iter__, and __len__.
415
416 """
417
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000418 @abstractmethod
419 def __getitem__(self, key):
420 raise KeyError
421
422 def get(self, key, default=None):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700423 'D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000424 try:
425 return self[key]
426 except KeyError:
427 return default
428
429 def __contains__(self, key):
430 try:
431 self[key]
432 except KeyError:
433 return False
434 else:
435 return True
436
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000437 def keys(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700438 "D.keys() -> a set-like object providing a view on D's keys"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000439 return KeysView(self)
440
441 def items(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700442 "D.items() -> a set-like object providing a view on D's items"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000443 return ItemsView(self)
444
445 def values(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700446 "D.values() -> an object providing a view on D's values"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000447 return ValuesView(self)
448
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000449 def __eq__(self, other):
Benjamin Peterson4ad6bd52010-05-21 20:55:22 +0000450 if not isinstance(other, Mapping):
451 return NotImplemented
452 return dict(self.items()) == dict(other.items())
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000453
454 def __ne__(self, other):
Raymond Hettinger554c8b82008-02-05 22:54:43 +0000455 return not (self == other)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000456
Victor Stinner7b17a4e2012-04-20 01:41:36 +0200457Mapping.register(mappingproxy)
458
Christian Heimes2202f872008-02-06 14:31:34 +0000459
Raymond Hettingerbfd06122008-02-09 10:04:32 +0000460class MappingView(Sized):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000461
462 def __init__(self, mapping):
463 self._mapping = mapping
464
465 def __len__(self):
466 return len(self._mapping)
467
Raymond Hettinger89fc2b72009-02-27 07:47:32 +0000468 def __repr__(self):
469 return '{0.__class__.__name__}({0._mapping!r})'.format(self)
470
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000471
472class KeysView(MappingView, Set):
473
Raymond Hettinger9117c752010-08-22 07:44:24 +0000474 @classmethod
475 def _from_iterable(self, it):
476 return set(it)
477
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000478 def __contains__(self, key):
479 return key in self._mapping
480
481 def __iter__(self):
Philip Jenvey4993cc02012-10-01 12:53:43 -0700482 yield from self._mapping
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000483
Christian Heimesf83be4e2007-11-28 09:44:38 +0000484KeysView.register(dict_keys)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000485
486
487class ItemsView(MappingView, Set):
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
511 def __contains__(self, value):
512 for key in self._mapping:
513 if value == self._mapping[key]:
514 return True
515 return False
516
517 def __iter__(self):
518 for key in self._mapping:
519 yield self._mapping[key]
520
Christian Heimesf83be4e2007-11-28 09:44:38 +0000521ValuesView.register(dict_values)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000522
523
524class MutableMapping(Mapping):
525
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700526 __slots__ = ()
527
Raymond Hettinger153866e2013-03-24 15:20:29 -0700528 """A MutableMapping is a generic container for associating
529 key/value pairs.
530
531 This class provides concrete generic implementations of all
532 methods except for __getitem__, __setitem__, __delitem__,
533 __iter__, and __len__.
534
535 """
536
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000537 @abstractmethod
538 def __setitem__(self, key, value):
539 raise KeyError
540
541 @abstractmethod
542 def __delitem__(self, key):
543 raise KeyError
544
545 __marker = object()
546
547 def pop(self, key, default=__marker):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700548 '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
549 If key is not found, d is returned if given, otherwise KeyError is raised.
550 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000551 try:
552 value = self[key]
553 except KeyError:
554 if default is self.__marker:
555 raise
556 return default
557 else:
558 del self[key]
559 return value
560
561 def popitem(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700562 '''D.popitem() -> (k, v), remove and return some (key, value) pair
563 as a 2-tuple; but raise KeyError if D is empty.
564 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000565 try:
566 key = next(iter(self))
567 except StopIteration:
568 raise KeyError
569 value = self[key]
570 del self[key]
571 return key, value
572
573 def clear(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700574 'D.clear() -> None. Remove all items from D.'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000575 try:
576 while True:
577 self.popitem()
578 except KeyError:
579 pass
580
Mark Dickinsonb214e902010-07-11 18:53:06 +0000581 def update(*args, **kwds):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700582 ''' D.update([E, ]**F) -> None. Update D from mapping/iterable E and F.
583 If E present and has a .keys() method, does: for k in E: D[k] = E[k]
584 If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v
585 In either case, this is followed by: for k, v in F.items(): D[k] = v
586 '''
Mark Dickinsonb214e902010-07-11 18:53:06 +0000587 if len(args) > 2:
588 raise TypeError("update() takes at most 2 positional "
589 "arguments ({} given)".format(len(args)))
590 elif not args:
591 raise TypeError("update() takes at least 1 argument (0 given)")
592 self = args[0]
593 other = args[1] if len(args) >= 2 else ()
594
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000595 if isinstance(other, Mapping):
596 for key in other:
597 self[key] = other[key]
598 elif hasattr(other, "keys"):
599 for key in other.keys():
600 self[key] = other[key]
601 else:
602 for key, value in other:
603 self[key] = value
604 for key, value in kwds.items():
605 self[key] = value
606
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000607 def setdefault(self, key, default=None):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700608 '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 +0000609 try:
610 return self[key]
611 except KeyError:
612 self[key] = default
613 return default
614
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000615MutableMapping.register(dict)
616
617
618### SEQUENCES ###
619
620
Raymond Hettinger74b64952008-02-09 02:53:48 +0000621class Sequence(Sized, Iterable, Container):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000622
623 """All the operations on a read-only sequence.
624
625 Concrete subclasses must override __new__ or __init__,
626 __getitem__, and __len__.
627 """
628
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700629 __slots__ = ()
630
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000631 @abstractmethod
632 def __getitem__(self, index):
633 raise IndexError
634
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000635 def __iter__(self):
636 i = 0
Raymond Hettinger71909422008-02-09 00:08:16 +0000637 try:
638 while True:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000639 v = self[i]
Raymond Hettinger71909422008-02-09 00:08:16 +0000640 yield v
641 i += 1
642 except IndexError:
643 return
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000644
645 def __contains__(self, value):
646 for v in self:
647 if v == value:
648 return True
649 return False
650
651 def __reversed__(self):
652 for i in reversed(range(len(self))):
653 yield self[i]
654
655 def index(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700656 '''S.index(value) -> integer -- return first index of value.
657 Raises ValueError if the value is not present.
658 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000659 for i, v in enumerate(self):
660 if v == value:
661 return i
662 raise ValueError
663
664 def count(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700665 'S.count(value) -> integer -- return number of occurrences of value'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000666 return sum(1 for v in self if v == value)
667
668Sequence.register(tuple)
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000669Sequence.register(str)
Raymond Hettinger9aa53c22009-02-24 11:25:35 +0000670Sequence.register(range)
Nick Coghlan45163cc2013-10-02 22:31:47 +1000671Sequence.register(memoryview)
Guido van Rossumd05eb002007-11-21 22:26:24 +0000672
673
674class ByteString(Sequence):
675
676 """This unifies bytes and bytearray.
677
678 XXX Should add all their methods.
679 """
680
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700681 __slots__ = ()
682
Guido van Rossumd05eb002007-11-21 22:26:24 +0000683ByteString.register(bytes)
684ByteString.register(bytearray)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000685
686
687class MutableSequence(Sequence):
688
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700689 __slots__ = ()
690
Guido van Rossum840c3102013-07-25 11:55:41 -0700691 """All the operations on a read-write sequence.
Raymond Hettinger153866e2013-03-24 15:20:29 -0700692
693 Concrete subclasses must provide __new__ or __init__,
694 __getitem__, __setitem__, __delitem__, __len__, and insert().
695
696 """
697
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000698 @abstractmethod
699 def __setitem__(self, index, value):
700 raise IndexError
701
702 @abstractmethod
703 def __delitem__(self, index):
704 raise IndexError
705
706 @abstractmethod
707 def insert(self, index, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700708 'S.insert(index, value) -- insert value before index'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000709 raise IndexError
710
711 def append(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700712 'S.append(value) -- append value to the end of the sequence'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000713 self.insert(len(self), value)
714
Eli Bendersky9479d1a2011-03-04 05:34:58 +0000715 def clear(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700716 'S.clear() -> None -- remove all items from S'
Eli Bendersky9479d1a2011-03-04 05:34:58 +0000717 try:
718 while True:
719 self.pop()
720 except IndexError:
721 pass
722
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000723 def reverse(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700724 'S.reverse() -- reverse *IN PLACE*'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000725 n = len(self)
726 for i in range(n//2):
727 self[i], self[n-i-1] = self[n-i-1], self[i]
728
729 def extend(self, values):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700730 'S.extend(iterable) -- extend sequence by appending elements from the iterable'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000731 for v in values:
732 self.append(v)
733
734 def pop(self, index=-1):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700735 '''S.pop([index]) -> item -- remove and return item at index (default last).
736 Raise IndexError if list is empty or index is out of range.
737 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000738 v = self[index]
739 del self[index]
740 return v
741
742 def remove(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700743 '''S.remove(value) -- remove first occurrence of value.
744 Raise ValueError if the value is not present.
745 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000746 del self[self.index(value)]
747
748 def __iadd__(self, values):
749 self.extend(values)
Raymond Hettingerc384b222009-05-18 15:35:26 +0000750 return self
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000751
752MutableSequence.register(list)
Guido van Rossumd05eb002007-11-21 22:26:24 +0000753MutableSequence.register(bytearray) # Multiply inheriting, see ByteString