blob: faa1ff22ff401b6d13d0016d71deef4d764697ff [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
186 semantics are fixed), all you have to do is redefine __le__ and
187 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
Andrew Svetlovbcac6ad2012-11-01 13:28:54 +0200210 return other.__lt__(self)
Raymond Hettinger71909422008-02-09 00:08:16 +0000211
212 def __ge__(self, other):
213 if not isinstance(other, Set):
214 return NotImplemented
Andrew Svetlovbcac6ad2012-11-01 13:28:54 +0200215 return other.__le__(self)
Raymond Hettinger71909422008-02-09 00:08:16 +0000216
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000217 def __eq__(self, other):
218 if not isinstance(other, Set):
219 return NotImplemented
220 return len(self) == len(other) and self.__le__(other)
221
Raymond Hettinger71909422008-02-09 00:08:16 +0000222 def __ne__(self, other):
223 return not (self == other)
224
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000225 @classmethod
226 def _from_iterable(cls, it):
Raymond Hettinger8284c4a2008-02-06 20:47:09 +0000227 '''Construct an instance of the class from any iterable input.
228
229 Must override this method if the class constructor signature
Raymond Hettinger7aebb642008-02-09 03:25:08 +0000230 does not accept an iterable for an input.
Raymond Hettinger8284c4a2008-02-06 20:47:09 +0000231 '''
Raymond Hettinger7aebb642008-02-09 03:25:08 +0000232 return cls(it)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000233
234 def __and__(self, other):
235 if not isinstance(other, Iterable):
236 return NotImplemented
237 return self._from_iterable(value for value in other if value in self)
238
Christian Heimes190d79e2008-01-30 11:58:22 +0000239 def isdisjoint(self, other):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700240 'Return True if two sets have a null intersection.'
Christian Heimes190d79e2008-01-30 11:58:22 +0000241 for value in other:
242 if value in self:
243 return False
244 return True
245
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000246 def __or__(self, other):
247 if not isinstance(other, Iterable):
248 return NotImplemented
Christian Heimes78644762008-03-04 23:39:23 +0000249 chain = (e for s in (self, other) for e in s)
250 return self._from_iterable(chain)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000251
252 def __sub__(self, other):
253 if not isinstance(other, Set):
254 if not isinstance(other, Iterable):
255 return NotImplemented
256 other = self._from_iterable(other)
257 return self._from_iterable(value for value in self
258 if value not in other)
259
260 def __xor__(self, other):
261 if not isinstance(other, Set):
262 if not isinstance(other, Iterable):
263 return NotImplemented
264 other = self._from_iterable(other)
265 return (self - other) | (other - self)
266
267 def _hash(self):
268 """Compute the hash value of a set.
269
270 Note that we don't define __hash__: not all sets are hashable.
271 But if you define a hashable set type, its __hash__ should
272 call this function.
273
274 This must be compatible __eq__.
275
276 All sets ought to compare equal if they contain the same
277 elements, regardless of how they are implemented, and
278 regardless of the order of the elements; so there's not much
279 freedom for __eq__ or __hash__. We match the algorithm used
280 by the built-in frozenset type.
281 """
Christian Heimesa37d4c62007-12-04 23:02:19 +0000282 MAX = sys.maxsize
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000283 MASK = 2 * MAX + 1
284 n = len(self)
285 h = 1927868237 * (n + 1)
286 h &= MASK
287 for x in self:
288 hx = hash(x)
289 h ^= (hx ^ (hx << 16) ^ 89869747) * 3644798167
290 h &= MASK
291 h = h * 69069 + 907133923
292 h &= MASK
293 if h > MAX:
294 h -= MASK + 1
295 if h == -1:
296 h = 590923713
297 return h
298
299Set.register(frozenset)
300
301
302class MutableSet(Set):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700303 """A mutable set is a finite, iterable container.
304
305 This class provides concrete generic implementations of all
306 methods except for __contains__, __iter__, __len__,
307 add(), and discard().
308
309 To override the comparisons (presumably for speed, as the
310 semantics are fixed), all you have to do is redefine __le__ and
311 then the other operations will automatically follow suit.
312 """
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000313
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700314 __slots__ = ()
315
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000316 @abstractmethod
317 def add(self, value):
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000318 """Add an element."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000319 raise NotImplementedError
320
321 @abstractmethod
322 def discard(self, value):
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000323 """Remove an element. Do not raise an exception if absent."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000324 raise NotImplementedError
325
Christian Heimes190d79e2008-01-30 11:58:22 +0000326 def remove(self, value):
327 """Remove an element. If not a member, raise a KeyError."""
328 if value not in self:
329 raise KeyError(value)
330 self.discard(value)
331
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000332 def pop(self):
333 """Return the popped value. Raise KeyError if empty."""
334 it = iter(self)
335 try:
Raymond Hettingerae650182009-01-28 23:33:59 +0000336 value = next(it)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000337 except StopIteration:
338 raise KeyError
339 self.discard(value)
340 return value
341
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000342 def clear(self):
343 """This is slow (creates N new iterators!) but effective."""
344 try:
345 while True:
346 self.pop()
347 except KeyError:
348 pass
349
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000350 def __ior__(self, it):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000351 for value in it:
352 self.add(value)
353 return self
354
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000355 def __iand__(self, it):
Raymond Hettinger3f10a952009-04-01 19:05:50 +0000356 for value in (self - it):
357 self.discard(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000358 return self
359
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000360 def __ixor__(self, it):
Daniel Stutzbach31da5b22010-08-24 20:49:57 +0000361 if it is self:
362 self.clear()
363 else:
364 if not isinstance(it, Set):
365 it = self._from_iterable(it)
366 for value in it:
367 if value in self:
368 self.discard(value)
369 else:
370 self.add(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000371 return self
372
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000373 def __isub__(self, it):
Daniel Stutzbach31da5b22010-08-24 20:49:57 +0000374 if it is self:
375 self.clear()
376 else:
377 for value in it:
378 self.discard(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000379 return self
380
381MutableSet.register(set)
382
383
384### MAPPINGS ###
385
386
Raymond Hettinger74b64952008-02-09 02:53:48 +0000387class Mapping(Sized, Iterable, Container):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000388
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700389 __slots__ = ()
390
Raymond Hettinger153866e2013-03-24 15:20:29 -0700391 """A Mapping is a generic container for associating key/value
392 pairs.
393
394 This class provides concrete generic implementations of all
395 methods except for __getitem__, __iter__, and __len__.
396
397 """
398
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000399 @abstractmethod
400 def __getitem__(self, key):
401 raise KeyError
402
403 def get(self, key, default=None):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700404 'D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000405 try:
406 return self[key]
407 except KeyError:
408 return default
409
410 def __contains__(self, key):
411 try:
412 self[key]
413 except KeyError:
414 return False
415 else:
416 return True
417
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000418 def keys(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700419 "D.keys() -> a set-like object providing a view on D's keys"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000420 return KeysView(self)
421
422 def items(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700423 "D.items() -> a set-like object providing a view on D's items"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000424 return ItemsView(self)
425
426 def values(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700427 "D.values() -> an object providing a view on D's values"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000428 return ValuesView(self)
429
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000430 def __eq__(self, other):
Benjamin Peterson4ad6bd52010-05-21 20:55:22 +0000431 if not isinstance(other, Mapping):
432 return NotImplemented
433 return dict(self.items()) == dict(other.items())
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000434
435 def __ne__(self, other):
Raymond Hettinger554c8b82008-02-05 22:54:43 +0000436 return not (self == other)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000437
Victor Stinner7b17a4e2012-04-20 01:41:36 +0200438Mapping.register(mappingproxy)
439
Christian Heimes2202f872008-02-06 14:31:34 +0000440
Raymond Hettingerbfd06122008-02-09 10:04:32 +0000441class MappingView(Sized):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000442
443 def __init__(self, mapping):
444 self._mapping = mapping
445
446 def __len__(self):
447 return len(self._mapping)
448
Raymond Hettinger89fc2b72009-02-27 07:47:32 +0000449 def __repr__(self):
450 return '{0.__class__.__name__}({0._mapping!r})'.format(self)
451
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000452
453class KeysView(MappingView, Set):
454
Raymond Hettinger9117c752010-08-22 07:44:24 +0000455 @classmethod
456 def _from_iterable(self, it):
457 return set(it)
458
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000459 def __contains__(self, key):
460 return key in self._mapping
461
462 def __iter__(self):
Philip Jenvey4993cc02012-10-01 12:53:43 -0700463 yield from self._mapping
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000464
Christian Heimesf83be4e2007-11-28 09:44:38 +0000465KeysView.register(dict_keys)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000466
467
468class ItemsView(MappingView, Set):
469
Raymond Hettinger9117c752010-08-22 07:44:24 +0000470 @classmethod
471 def _from_iterable(self, it):
472 return set(it)
473
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000474 def __contains__(self, item):
475 key, value = item
476 try:
477 v = self._mapping[key]
478 except KeyError:
479 return False
480 else:
481 return v == value
482
483 def __iter__(self):
484 for key in self._mapping:
485 yield (key, self._mapping[key])
486
Christian Heimesf83be4e2007-11-28 09:44:38 +0000487ItemsView.register(dict_items)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000488
489
490class ValuesView(MappingView):
491
492 def __contains__(self, value):
493 for key in self._mapping:
494 if value == self._mapping[key]:
495 return True
496 return False
497
498 def __iter__(self):
499 for key in self._mapping:
500 yield self._mapping[key]
501
Christian Heimesf83be4e2007-11-28 09:44:38 +0000502ValuesView.register(dict_values)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000503
504
505class MutableMapping(Mapping):
506
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700507 __slots__ = ()
508
Raymond Hettinger153866e2013-03-24 15:20:29 -0700509 """A MutableMapping is a generic container for associating
510 key/value pairs.
511
512 This class provides concrete generic implementations of all
513 methods except for __getitem__, __setitem__, __delitem__,
514 __iter__, and __len__.
515
516 """
517
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000518 @abstractmethod
519 def __setitem__(self, key, value):
520 raise KeyError
521
522 @abstractmethod
523 def __delitem__(self, key):
524 raise KeyError
525
526 __marker = object()
527
528 def pop(self, key, default=__marker):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700529 '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
530 If key is not found, d is returned if given, otherwise KeyError is raised.
531 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000532 try:
533 value = self[key]
534 except KeyError:
535 if default is self.__marker:
536 raise
537 return default
538 else:
539 del self[key]
540 return value
541
542 def popitem(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700543 '''D.popitem() -> (k, v), remove and return some (key, value) pair
544 as a 2-tuple; but raise KeyError if D is empty.
545 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000546 try:
547 key = next(iter(self))
548 except StopIteration:
549 raise KeyError
550 value = self[key]
551 del self[key]
552 return key, value
553
554 def clear(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700555 'D.clear() -> None. Remove all items from D.'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000556 try:
557 while True:
558 self.popitem()
559 except KeyError:
560 pass
561
Mark Dickinsonb214e902010-07-11 18:53:06 +0000562 def update(*args, **kwds):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700563 ''' D.update([E, ]**F) -> None. Update D from mapping/iterable E and F.
564 If E present and has a .keys() method, does: for k in E: D[k] = E[k]
565 If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v
566 In either case, this is followed by: for k, v in F.items(): D[k] = v
567 '''
Mark Dickinsonb214e902010-07-11 18:53:06 +0000568 if len(args) > 2:
569 raise TypeError("update() takes at most 2 positional "
570 "arguments ({} given)".format(len(args)))
571 elif not args:
572 raise TypeError("update() takes at least 1 argument (0 given)")
573 self = args[0]
574 other = args[1] if len(args) >= 2 else ()
575
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000576 if isinstance(other, Mapping):
577 for key in other:
578 self[key] = other[key]
579 elif hasattr(other, "keys"):
580 for key in other.keys():
581 self[key] = other[key]
582 else:
583 for key, value in other:
584 self[key] = value
585 for key, value in kwds.items():
586 self[key] = value
587
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000588 def setdefault(self, key, default=None):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700589 '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 +0000590 try:
591 return self[key]
592 except KeyError:
593 self[key] = default
594 return default
595
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000596MutableMapping.register(dict)
597
598
599### SEQUENCES ###
600
601
Raymond Hettinger74b64952008-02-09 02:53:48 +0000602class Sequence(Sized, Iterable, Container):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000603
604 """All the operations on a read-only sequence.
605
606 Concrete subclasses must override __new__ or __init__,
607 __getitem__, and __len__.
608 """
609
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700610 __slots__ = ()
611
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000612 @abstractmethod
613 def __getitem__(self, index):
614 raise IndexError
615
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000616 def __iter__(self):
617 i = 0
Raymond Hettinger71909422008-02-09 00:08:16 +0000618 try:
619 while True:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000620 v = self[i]
Raymond Hettinger71909422008-02-09 00:08:16 +0000621 yield v
622 i += 1
623 except IndexError:
624 return
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000625
626 def __contains__(self, value):
627 for v in self:
628 if v == value:
629 return True
630 return False
631
632 def __reversed__(self):
633 for i in reversed(range(len(self))):
634 yield self[i]
635
636 def index(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700637 '''S.index(value) -> integer -- return first index of value.
638 Raises ValueError if the value is not present.
639 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000640 for i, v in enumerate(self):
641 if v == value:
642 return i
643 raise ValueError
644
645 def count(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700646 'S.count(value) -> integer -- return number of occurrences of value'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000647 return sum(1 for v in self if v == value)
648
649Sequence.register(tuple)
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000650Sequence.register(str)
Raymond Hettinger9aa53c22009-02-24 11:25:35 +0000651Sequence.register(range)
Nick Coghlan45163cc2013-10-02 22:31:47 +1000652Sequence.register(memoryview)
Guido van Rossumd05eb002007-11-21 22:26:24 +0000653
654
655class ByteString(Sequence):
656
657 """This unifies bytes and bytearray.
658
659 XXX Should add all their methods.
660 """
661
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700662 __slots__ = ()
663
Guido van Rossumd05eb002007-11-21 22:26:24 +0000664ByteString.register(bytes)
665ByteString.register(bytearray)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000666
667
668class MutableSequence(Sequence):
669
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700670 __slots__ = ()
671
Guido van Rossum840c3102013-07-25 11:55:41 -0700672 """All the operations on a read-write sequence.
Raymond Hettinger153866e2013-03-24 15:20:29 -0700673
674 Concrete subclasses must provide __new__ or __init__,
675 __getitem__, __setitem__, __delitem__, __len__, and insert().
676
677 """
678
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000679 @abstractmethod
680 def __setitem__(self, index, value):
681 raise IndexError
682
683 @abstractmethod
684 def __delitem__(self, index):
685 raise IndexError
686
687 @abstractmethod
688 def insert(self, index, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700689 'S.insert(index, value) -- insert value before index'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000690 raise IndexError
691
692 def append(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700693 'S.append(value) -- append value to the end of the sequence'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000694 self.insert(len(self), value)
695
Eli Bendersky9479d1a2011-03-04 05:34:58 +0000696 def clear(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700697 'S.clear() -> None -- remove all items from S'
Eli Bendersky9479d1a2011-03-04 05:34:58 +0000698 try:
699 while True:
700 self.pop()
701 except IndexError:
702 pass
703
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000704 def reverse(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700705 'S.reverse() -- reverse *IN PLACE*'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000706 n = len(self)
707 for i in range(n//2):
708 self[i], self[n-i-1] = self[n-i-1], self[i]
709
710 def extend(self, values):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700711 'S.extend(iterable) -- extend sequence by appending elements from the iterable'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000712 for v in values:
713 self.append(v)
714
715 def pop(self, index=-1):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700716 '''S.pop([index]) -> item -- remove and return item at index (default last).
717 Raise IndexError if list is empty or index is out of range.
718 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000719 v = self[index]
720 del self[index]
721 return v
722
723 def remove(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700724 '''S.remove(value) -- remove first occurrence of value.
725 Raise ValueError if the value is not present.
726 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000727 del self[self.index(value)]
728
729 def __iadd__(self, values):
730 self.extend(values)
Raymond Hettingerc384b222009-05-18 15:35:26 +0000731 return self
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000732
733MutableSequence.register(list)
Guido van Rossumd05eb002007-11-21 22:26:24 +0000734MutableSequence.register(bytearray) # Multiply inheriting, see ByteString