blob: 33b59aba1b9fd3030115dd06721c18b70b16cfa1 [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
456 def __init__(self, mapping):
457 self._mapping = mapping
458
459 def __len__(self):
460 return len(self._mapping)
461
Raymond Hettinger89fc2b72009-02-27 07:47:32 +0000462 def __repr__(self):
463 return '{0.__class__.__name__}({0._mapping!r})'.format(self)
464
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000465
466class KeysView(MappingView, Set):
467
Raymond Hettinger9117c752010-08-22 07:44:24 +0000468 @classmethod
469 def _from_iterable(self, it):
470 return set(it)
471
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000472 def __contains__(self, key):
473 return key in self._mapping
474
475 def __iter__(self):
Philip Jenvey4993cc02012-10-01 12:53:43 -0700476 yield from self._mapping
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000477
Christian Heimesf83be4e2007-11-28 09:44:38 +0000478KeysView.register(dict_keys)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000479
480
481class ItemsView(MappingView, Set):
482
Raymond Hettinger9117c752010-08-22 07:44:24 +0000483 @classmethod
484 def _from_iterable(self, it):
485 return set(it)
486
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000487 def __contains__(self, item):
488 key, value = item
489 try:
490 v = self._mapping[key]
491 except KeyError:
492 return False
493 else:
494 return v == value
495
496 def __iter__(self):
497 for key in self._mapping:
498 yield (key, self._mapping[key])
499
Christian Heimesf83be4e2007-11-28 09:44:38 +0000500ItemsView.register(dict_items)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000501
502
503class ValuesView(MappingView):
504
505 def __contains__(self, value):
506 for key in self._mapping:
507 if value == self._mapping[key]:
508 return True
509 return False
510
511 def __iter__(self):
512 for key in self._mapping:
513 yield self._mapping[key]
514
Christian Heimesf83be4e2007-11-28 09:44:38 +0000515ValuesView.register(dict_values)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000516
517
518class MutableMapping(Mapping):
519
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700520 __slots__ = ()
521
Raymond Hettinger153866e2013-03-24 15:20:29 -0700522 """A MutableMapping is a generic container for associating
523 key/value pairs.
524
525 This class provides concrete generic implementations of all
526 methods except for __getitem__, __setitem__, __delitem__,
527 __iter__, and __len__.
528
529 """
530
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000531 @abstractmethod
532 def __setitem__(self, key, value):
533 raise KeyError
534
535 @abstractmethod
536 def __delitem__(self, key):
537 raise KeyError
538
539 __marker = object()
540
541 def pop(self, key, default=__marker):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700542 '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
543 If key is not found, d is returned if given, otherwise KeyError is raised.
544 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000545 try:
546 value = self[key]
547 except KeyError:
548 if default is self.__marker:
549 raise
550 return default
551 else:
552 del self[key]
553 return value
554
555 def popitem(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700556 '''D.popitem() -> (k, v), remove and return some (key, value) pair
557 as a 2-tuple; but raise KeyError if D is empty.
558 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000559 try:
560 key = next(iter(self))
561 except StopIteration:
562 raise KeyError
563 value = self[key]
564 del self[key]
565 return key, value
566
567 def clear(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700568 'D.clear() -> None. Remove all items from D.'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000569 try:
570 while True:
571 self.popitem()
572 except KeyError:
573 pass
574
Mark Dickinsonb214e902010-07-11 18:53:06 +0000575 def update(*args, **kwds):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700576 ''' D.update([E, ]**F) -> None. Update D from mapping/iterable E and F.
577 If E present and has a .keys() method, does: for k in E: D[k] = E[k]
578 If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v
579 In either case, this is followed by: for k, v in F.items(): D[k] = v
580 '''
Serhiy Storchakaae5cb212014-11-27 16:25:51 +0200581 if not args:
582 raise TypeError("descriptor 'update' of 'MutableMapping' object "
583 "needs an argument")
584 self, *args = args
585 if len(args) > 1:
586 raise TypeError('update expected at most 1 arguments, got %d' %
587 len(args))
588 if args:
589 other = args[0]
590 if isinstance(other, Mapping):
591 for key in other:
592 self[key] = other[key]
593 elif hasattr(other, "keys"):
594 for key in other.keys():
595 self[key] = other[key]
596 else:
597 for key, value in other:
598 self[key] = value
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000599 for key, value in kwds.items():
600 self[key] = value
601
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000602 def setdefault(self, key, default=None):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700603 '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 +0000604 try:
605 return self[key]
606 except KeyError:
607 self[key] = default
608 return default
609
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000610MutableMapping.register(dict)
611
612
613### SEQUENCES ###
614
615
Raymond Hettinger74b64952008-02-09 02:53:48 +0000616class Sequence(Sized, Iterable, Container):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000617
618 """All the operations on a read-only sequence.
619
620 Concrete subclasses must override __new__ or __init__,
621 __getitem__, and __len__.
622 """
623
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700624 __slots__ = ()
625
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000626 @abstractmethod
627 def __getitem__(self, index):
628 raise IndexError
629
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000630 def __iter__(self):
631 i = 0
Raymond Hettinger71909422008-02-09 00:08:16 +0000632 try:
633 while True:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000634 v = self[i]
Raymond Hettinger71909422008-02-09 00:08:16 +0000635 yield v
636 i += 1
637 except IndexError:
638 return
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000639
640 def __contains__(self, value):
641 for v in self:
642 if v == value:
643 return True
644 return False
645
646 def __reversed__(self):
647 for i in reversed(range(len(self))):
648 yield self[i]
649
650 def index(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700651 '''S.index(value) -> integer -- return first index of value.
652 Raises ValueError if the value is not present.
653 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000654 for i, v in enumerate(self):
655 if v == value:
656 return i
657 raise ValueError
658
659 def count(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700660 'S.count(value) -> integer -- return number of occurrences of value'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000661 return sum(1 for v in self if v == value)
662
663Sequence.register(tuple)
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000664Sequence.register(str)
Raymond Hettinger9aa53c22009-02-24 11:25:35 +0000665Sequence.register(range)
Nick Coghlan45163cc2013-10-02 22:31:47 +1000666Sequence.register(memoryview)
Guido van Rossumd05eb002007-11-21 22:26:24 +0000667
668
669class ByteString(Sequence):
670
671 """This unifies bytes and bytearray.
672
673 XXX Should add all their methods.
674 """
675
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700676 __slots__ = ()
677
Guido van Rossumd05eb002007-11-21 22:26:24 +0000678ByteString.register(bytes)
679ByteString.register(bytearray)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000680
681
682class MutableSequence(Sequence):
683
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700684 __slots__ = ()
685
Guido van Rossum840c3102013-07-25 11:55:41 -0700686 """All the operations on a read-write sequence.
Raymond Hettinger153866e2013-03-24 15:20:29 -0700687
688 Concrete subclasses must provide __new__ or __init__,
689 __getitem__, __setitem__, __delitem__, __len__, and insert().
690
691 """
692
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000693 @abstractmethod
694 def __setitem__(self, index, value):
695 raise IndexError
696
697 @abstractmethod
698 def __delitem__(self, index):
699 raise IndexError
700
701 @abstractmethod
702 def insert(self, index, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700703 'S.insert(index, value) -- insert value before index'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000704 raise IndexError
705
706 def append(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700707 'S.append(value) -- append value to the end of the sequence'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000708 self.insert(len(self), value)
709
Eli Bendersky9479d1a2011-03-04 05:34:58 +0000710 def clear(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700711 'S.clear() -> None -- remove all items from S'
Eli Bendersky9479d1a2011-03-04 05:34:58 +0000712 try:
713 while True:
714 self.pop()
715 except IndexError:
716 pass
717
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000718 def reverse(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700719 'S.reverse() -- reverse *IN PLACE*'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000720 n = len(self)
721 for i in range(n//2):
722 self[i], self[n-i-1] = self[n-i-1], self[i]
723
724 def extend(self, values):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700725 'S.extend(iterable) -- extend sequence by appending elements from the iterable'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000726 for v in values:
727 self.append(v)
728
729 def pop(self, index=-1):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700730 '''S.pop([index]) -> item -- remove and return item at index (default last).
731 Raise IndexError if list is empty or index is out of range.
732 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000733 v = self[index]
734 del self[index]
735 return v
736
737 def remove(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700738 '''S.remove(value) -- remove first occurrence of value.
739 Raise ValueError if the value is not present.
740 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000741 del self[self.index(value)]
742
743 def __iadd__(self, values):
744 self.extend(values)
Raymond Hettingerc384b222009-05-18 15:35:26 +0000745 return self
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000746
747MutableSequence.register(list)
Guido van Rossumd05eb002007-11-21 22:26:24 +0000748MutableSequence.register(bytearray) # Multiply inheriting, see ByteString