blob: 7fbe84dfe97c092075ece7c29d777ed73edb2a0d [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 Heimesf83be4e2007-11-28 09:44:38 +000021
22### collection related types which are not exposed through builtin ###
23## iterators ##
24bytes_iterator = type(iter(b''))
25bytearray_iterator = type(iter(bytearray()))
26#callable_iterator = ???
27dict_keyiterator = type(iter({}.keys()))
28dict_valueiterator = type(iter({}.values()))
29dict_itemiterator = type(iter({}.items()))
30list_iterator = type(iter([]))
31list_reverseiterator = type(iter(reversed([])))
32range_iterator = type(iter(range(0)))
33set_iterator = type(iter(set()))
34str_iterator = type(iter(""))
35tuple_iterator = type(iter(()))
36zip_iterator = type(iter(zip()))
37## views ##
38dict_keys = type({}.keys())
39dict_values = type({}.values())
40dict_items = type({}.items())
Christian Heimes0db38532007-11-29 16:21:13 +000041## misc ##
42dict_proxy = type(type.__dict__)
Christian Heimesf83be4e2007-11-28 09:44:38 +000043
44
Guido van Rossumcd16bf62007-06-13 18:07:49 +000045### ONE-TRICK PONIES ###
46
47class Hashable(metaclass=ABCMeta):
48
Raymond Hettingerc46759a2011-03-22 11:46:25 -070049 __slots__ = ()
50
Guido van Rossumcd16bf62007-06-13 18:07:49 +000051 @abstractmethod
52 def __hash__(self):
53 return 0
54
55 @classmethod
56 def __subclasshook__(cls, C):
57 if cls is Hashable:
58 for B in C.__mro__:
59 if "__hash__" in B.__dict__:
60 if B.__dict__["__hash__"]:
61 return True
62 break
63 return NotImplemented
64
65
66class Iterable(metaclass=ABCMeta):
67
Raymond Hettingerc46759a2011-03-22 11:46:25 -070068 __slots__ = ()
69
Guido van Rossumcd16bf62007-06-13 18:07:49 +000070 @abstractmethod
71 def __iter__(self):
72 while False:
73 yield None
74
75 @classmethod
76 def __subclasshook__(cls, C):
77 if cls is Iterable:
78 if any("__iter__" in B.__dict__ for B in C.__mro__):
79 return True
80 return NotImplemented
81
Guido van Rossumcd16bf62007-06-13 18:07:49 +000082
Raymond Hettinger74b64952008-02-09 02:53:48 +000083class Iterator(Iterable):
Guido van Rossumcd16bf62007-06-13 18:07:49 +000084
Raymond Hettingerc46759a2011-03-22 11:46:25 -070085 __slots__ = ()
86
Guido van Rossumcd16bf62007-06-13 18:07:49 +000087 @abstractmethod
88 def __next__(self):
89 raise StopIteration
90
91 def __iter__(self):
92 return self
93
94 @classmethod
95 def __subclasshook__(cls, C):
96 if cls is Iterator:
Raymond Hettingeread22222010-11-29 03:56:12 +000097 if (any("__next__" in B.__dict__ for B in C.__mro__) and
98 any("__iter__" in B.__dict__ for B in C.__mro__)):
Guido van Rossumcd16bf62007-06-13 18:07:49 +000099 return True
100 return NotImplemented
101
Christian Heimesf83be4e2007-11-28 09:44:38 +0000102Iterator.register(bytes_iterator)
103Iterator.register(bytearray_iterator)
104#Iterator.register(callable_iterator)
105Iterator.register(dict_keyiterator)
106Iterator.register(dict_valueiterator)
107Iterator.register(dict_itemiterator)
108Iterator.register(list_iterator)
109Iterator.register(list_reverseiterator)
110Iterator.register(range_iterator)
111Iterator.register(set_iterator)
112Iterator.register(str_iterator)
113Iterator.register(tuple_iterator)
114Iterator.register(zip_iterator)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000115
116class Sized(metaclass=ABCMeta):
117
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700118 __slots__ = ()
119
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000120 @abstractmethod
121 def __len__(self):
122 return 0
123
124 @classmethod
125 def __subclasshook__(cls, C):
126 if cls is Sized:
127 if any("__len__" in B.__dict__ for B in C.__mro__):
128 return True
129 return NotImplemented
130
131
132class Container(metaclass=ABCMeta):
133
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700134 __slots__ = ()
135
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000136 @abstractmethod
137 def __contains__(self, x):
138 return False
139
140 @classmethod
141 def __subclasshook__(cls, C):
142 if cls is Container:
143 if any("__contains__" in B.__dict__ for B in C.__mro__):
144 return True
145 return NotImplemented
146
147
148class Callable(metaclass=ABCMeta):
149
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700150 __slots__ = ()
151
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000152 @abstractmethod
Christian Heimes78644762008-03-04 23:39:23 +0000153 def __call__(self, *args, **kwds):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000154 return False
155
156 @classmethod
157 def __subclasshook__(cls, C):
158 if cls is Callable:
159 if any("__call__" in B.__dict__ for B in C.__mro__):
160 return True
161 return NotImplemented
162
163
164### SETS ###
165
166
Raymond Hettinger74b64952008-02-09 02:53:48 +0000167class Set(Sized, Iterable, Container):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000168
169 """A set is a finite, iterable container.
170
171 This class provides concrete generic implementations of all
172 methods except for __contains__, __iter__ and __len__.
173
174 To override the comparisons (presumably for speed, as the
175 semantics are fixed), all you have to do is redefine __le__ and
176 then the other operations will automatically follow suit.
177 """
178
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700179 __slots__ = ()
180
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000181 def __le__(self, other):
182 if not isinstance(other, Set):
183 return NotImplemented
184 if len(self) > len(other):
185 return False
186 for elem in self:
187 if elem not in other:
188 return False
189 return True
190
191 def __lt__(self, other):
192 if not isinstance(other, Set):
193 return NotImplemented
194 return len(self) < len(other) and self.__le__(other)
195
Raymond Hettinger71909422008-02-09 00:08:16 +0000196 def __gt__(self, other):
197 if not isinstance(other, Set):
198 return NotImplemented
199 return other < self
200
201 def __ge__(self, other):
202 if not isinstance(other, Set):
203 return NotImplemented
204 return other <= self
205
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000206 def __eq__(self, other):
207 if not isinstance(other, Set):
208 return NotImplemented
209 return len(self) == len(other) and self.__le__(other)
210
Raymond Hettinger71909422008-02-09 00:08:16 +0000211 def __ne__(self, other):
212 return not (self == other)
213
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000214 @classmethod
215 def _from_iterable(cls, it):
Raymond Hettinger8284c4a2008-02-06 20:47:09 +0000216 '''Construct an instance of the class from any iterable input.
217
218 Must override this method if the class constructor signature
Raymond Hettinger7aebb642008-02-09 03:25:08 +0000219 does not accept an iterable for an input.
Raymond Hettinger8284c4a2008-02-06 20:47:09 +0000220 '''
Raymond Hettinger7aebb642008-02-09 03:25:08 +0000221 return cls(it)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000222
223 def __and__(self, other):
224 if not isinstance(other, Iterable):
225 return NotImplemented
226 return self._from_iterable(value for value in other if value in self)
227
Christian Heimes190d79e2008-01-30 11:58:22 +0000228 def isdisjoint(self, other):
229 for value in other:
230 if value in self:
231 return False
232 return True
233
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000234 def __or__(self, other):
235 if not isinstance(other, Iterable):
236 return NotImplemented
Christian Heimes78644762008-03-04 23:39:23 +0000237 chain = (e for s in (self, other) for e in s)
238 return self._from_iterable(chain)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000239
240 def __sub__(self, other):
241 if not isinstance(other, Set):
242 if not isinstance(other, Iterable):
243 return NotImplemented
244 other = self._from_iterable(other)
245 return self._from_iterable(value for value in self
246 if value not in other)
247
248 def __xor__(self, other):
249 if not isinstance(other, Set):
250 if not isinstance(other, Iterable):
251 return NotImplemented
252 other = self._from_iterable(other)
253 return (self - other) | (other - self)
254
255 def _hash(self):
256 """Compute the hash value of a set.
257
258 Note that we don't define __hash__: not all sets are hashable.
259 But if you define a hashable set type, its __hash__ should
260 call this function.
261
262 This must be compatible __eq__.
263
264 All sets ought to compare equal if they contain the same
265 elements, regardless of how they are implemented, and
266 regardless of the order of the elements; so there's not much
267 freedom for __eq__ or __hash__. We match the algorithm used
268 by the built-in frozenset type.
269 """
Christian Heimesa37d4c62007-12-04 23:02:19 +0000270 MAX = sys.maxsize
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000271 MASK = 2 * MAX + 1
272 n = len(self)
273 h = 1927868237 * (n + 1)
274 h &= MASK
275 for x in self:
276 hx = hash(x)
277 h ^= (hx ^ (hx << 16) ^ 89869747) * 3644798167
278 h &= MASK
279 h = h * 69069 + 907133923
280 h &= MASK
281 if h > MAX:
282 h -= MASK + 1
283 if h == -1:
284 h = 590923713
285 return h
286
287Set.register(frozenset)
288
289
290class MutableSet(Set):
291
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700292 __slots__ = ()
293
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000294 @abstractmethod
295 def add(self, value):
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000296 """Add an element."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000297 raise NotImplementedError
298
299 @abstractmethod
300 def discard(self, value):
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000301 """Remove an element. Do not raise an exception if absent."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000302 raise NotImplementedError
303
Christian Heimes190d79e2008-01-30 11:58:22 +0000304 def remove(self, value):
305 """Remove an element. If not a member, raise a KeyError."""
306 if value not in self:
307 raise KeyError(value)
308 self.discard(value)
309
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000310 def pop(self):
311 """Return the popped value. Raise KeyError if empty."""
312 it = iter(self)
313 try:
Raymond Hettingerae650182009-01-28 23:33:59 +0000314 value = next(it)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000315 except StopIteration:
316 raise KeyError
317 self.discard(value)
318 return value
319
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000320 def clear(self):
321 """This is slow (creates N new iterators!) but effective."""
322 try:
323 while True:
324 self.pop()
325 except KeyError:
326 pass
327
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000328 def __ior__(self, it):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000329 for value in it:
330 self.add(value)
331 return self
332
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000333 def __iand__(self, it):
Raymond Hettinger3f10a952009-04-01 19:05:50 +0000334 for value in (self - it):
335 self.discard(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000336 return self
337
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000338 def __ixor__(self, it):
Daniel Stutzbach31da5b22010-08-24 20:49:57 +0000339 if it is self:
340 self.clear()
341 else:
342 if not isinstance(it, Set):
343 it = self._from_iterable(it)
344 for value in it:
345 if value in self:
346 self.discard(value)
347 else:
348 self.add(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000349 return self
350
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000351 def __isub__(self, it):
Daniel Stutzbach31da5b22010-08-24 20:49:57 +0000352 if it is self:
353 self.clear()
354 else:
355 for value in it:
356 self.discard(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000357 return self
358
359MutableSet.register(set)
360
361
362### MAPPINGS ###
363
364
Raymond Hettinger74b64952008-02-09 02:53:48 +0000365class Mapping(Sized, Iterable, Container):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000366
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700367 __slots__ = ()
368
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000369 @abstractmethod
370 def __getitem__(self, key):
371 raise KeyError
372
373 def get(self, key, default=None):
374 try:
375 return self[key]
376 except KeyError:
377 return default
378
379 def __contains__(self, key):
380 try:
381 self[key]
382 except KeyError:
383 return False
384 else:
385 return True
386
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000387 def keys(self):
388 return KeysView(self)
389
390 def items(self):
391 return ItemsView(self)
392
393 def values(self):
394 return ValuesView(self)
395
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000396 def __eq__(self, other):
Benjamin Peterson4ad6bd52010-05-21 20:55:22 +0000397 if not isinstance(other, Mapping):
398 return NotImplemented
399 return dict(self.items()) == dict(other.items())
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000400
401 def __ne__(self, other):
Raymond Hettinger554c8b82008-02-05 22:54:43 +0000402 return not (self == other)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000403
Christian Heimes2202f872008-02-06 14:31:34 +0000404
Raymond Hettingerbfd06122008-02-09 10:04:32 +0000405class MappingView(Sized):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000406
407 def __init__(self, mapping):
408 self._mapping = mapping
409
410 def __len__(self):
411 return len(self._mapping)
412
Raymond Hettinger89fc2b72009-02-27 07:47:32 +0000413 def __repr__(self):
414 return '{0.__class__.__name__}({0._mapping!r})'.format(self)
415
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000416
417class KeysView(MappingView, Set):
418
Raymond Hettinger9117c752010-08-22 07:44:24 +0000419 @classmethod
420 def _from_iterable(self, it):
421 return set(it)
422
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000423 def __contains__(self, key):
424 return key in self._mapping
425
426 def __iter__(self):
427 for key in self._mapping:
428 yield key
429
Christian Heimesf83be4e2007-11-28 09:44:38 +0000430KeysView.register(dict_keys)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000431
432
433class ItemsView(MappingView, Set):
434
Raymond Hettinger9117c752010-08-22 07:44:24 +0000435 @classmethod
436 def _from_iterable(self, it):
437 return set(it)
438
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000439 def __contains__(self, item):
440 key, value = item
441 try:
442 v = self._mapping[key]
443 except KeyError:
444 return False
445 else:
446 return v == value
447
448 def __iter__(self):
449 for key in self._mapping:
450 yield (key, self._mapping[key])
451
Christian Heimesf83be4e2007-11-28 09:44:38 +0000452ItemsView.register(dict_items)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000453
454
455class ValuesView(MappingView):
456
457 def __contains__(self, value):
458 for key in self._mapping:
459 if value == self._mapping[key]:
460 return True
461 return False
462
463 def __iter__(self):
464 for key in self._mapping:
465 yield self._mapping[key]
466
Christian Heimesf83be4e2007-11-28 09:44:38 +0000467ValuesView.register(dict_values)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000468
469
470class MutableMapping(Mapping):
471
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700472 __slots__ = ()
473
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000474 @abstractmethod
475 def __setitem__(self, key, value):
476 raise KeyError
477
478 @abstractmethod
479 def __delitem__(self, key):
480 raise KeyError
481
482 __marker = object()
483
484 def pop(self, key, default=__marker):
485 try:
486 value = self[key]
487 except KeyError:
488 if default is self.__marker:
489 raise
490 return default
491 else:
492 del self[key]
493 return value
494
495 def popitem(self):
496 try:
497 key = next(iter(self))
498 except StopIteration:
499 raise KeyError
500 value = self[key]
501 del self[key]
502 return key, value
503
504 def clear(self):
505 try:
506 while True:
507 self.popitem()
508 except KeyError:
509 pass
510
Mark Dickinsonb214e902010-07-11 18:53:06 +0000511 def update(*args, **kwds):
512 if len(args) > 2:
513 raise TypeError("update() takes at most 2 positional "
514 "arguments ({} given)".format(len(args)))
515 elif not args:
516 raise TypeError("update() takes at least 1 argument (0 given)")
517 self = args[0]
518 other = args[1] if len(args) >= 2 else ()
519
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000520 if isinstance(other, Mapping):
521 for key in other:
522 self[key] = other[key]
523 elif hasattr(other, "keys"):
524 for key in other.keys():
525 self[key] = other[key]
526 else:
527 for key, value in other:
528 self[key] = value
529 for key, value in kwds.items():
530 self[key] = value
531
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000532 def setdefault(self, key, default=None):
533 try:
534 return self[key]
535 except KeyError:
536 self[key] = default
537 return default
538
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000539MutableMapping.register(dict)
540
541
542### SEQUENCES ###
543
544
Raymond Hettinger74b64952008-02-09 02:53:48 +0000545class Sequence(Sized, Iterable, Container):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000546
547 """All the operations on a read-only sequence.
548
549 Concrete subclasses must override __new__ or __init__,
550 __getitem__, and __len__.
551 """
552
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700553 __slots__ = ()
554
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000555 @abstractmethod
556 def __getitem__(self, index):
557 raise IndexError
558
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000559 def __iter__(self):
560 i = 0
Raymond Hettinger71909422008-02-09 00:08:16 +0000561 try:
562 while True:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000563 v = self[i]
Raymond Hettinger71909422008-02-09 00:08:16 +0000564 yield v
565 i += 1
566 except IndexError:
567 return
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000568
569 def __contains__(self, value):
570 for v in self:
571 if v == value:
572 return True
573 return False
574
575 def __reversed__(self):
576 for i in reversed(range(len(self))):
577 yield self[i]
578
579 def index(self, value):
580 for i, v in enumerate(self):
581 if v == value:
582 return i
583 raise ValueError
584
585 def count(self, value):
586 return sum(1 for v in self if v == value)
587
588Sequence.register(tuple)
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000589Sequence.register(str)
Raymond Hettinger9aa53c22009-02-24 11:25:35 +0000590Sequence.register(range)
Guido van Rossumd05eb002007-11-21 22:26:24 +0000591
592
593class ByteString(Sequence):
594
595 """This unifies bytes and bytearray.
596
597 XXX Should add all their methods.
598 """
599
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700600 __slots__ = ()
601
Guido van Rossumd05eb002007-11-21 22:26:24 +0000602ByteString.register(bytes)
603ByteString.register(bytearray)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000604
605
606class MutableSequence(Sequence):
607
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700608 __slots__ = ()
609
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000610 @abstractmethod
611 def __setitem__(self, index, value):
612 raise IndexError
613
614 @abstractmethod
615 def __delitem__(self, index):
616 raise IndexError
617
618 @abstractmethod
619 def insert(self, index, value):
620 raise IndexError
621
622 def append(self, value):
623 self.insert(len(self), value)
624
Eli Bendersky9479d1a2011-03-04 05:34:58 +0000625 def clear(self):
626 try:
627 while True:
628 self.pop()
629 except IndexError:
630 pass
631
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000632 def reverse(self):
633 n = len(self)
634 for i in range(n//2):
635 self[i], self[n-i-1] = self[n-i-1], self[i]
636
637 def extend(self, values):
638 for v in values:
639 self.append(v)
640
641 def pop(self, index=-1):
642 v = self[index]
643 del self[index]
644 return v
645
646 def remove(self, value):
647 del self[self.index(value)]
648
649 def __iadd__(self, values):
650 self.extend(values)
Raymond Hettingerc384b222009-05-18 15:35:26 +0000651 return self
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000652
653MutableSequence.register(list)
Guido van Rossumd05eb002007-11-21 22:26:24 +0000654MutableSequence.register(bytearray) # Multiply inheriting, see ByteString