blob: 6e908bdce973fde7ed675df81658bd66b42e20d7 [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
49 @abstractmethod
50 def __hash__(self):
51 return 0
52
53 @classmethod
54 def __subclasshook__(cls, C):
55 if cls is Hashable:
56 for B in C.__mro__:
57 if "__hash__" in B.__dict__:
58 if B.__dict__["__hash__"]:
59 return True
60 break
61 return NotImplemented
62
63
64class Iterable(metaclass=ABCMeta):
65
66 @abstractmethod
67 def __iter__(self):
68 while False:
69 yield None
70
71 @classmethod
72 def __subclasshook__(cls, C):
73 if cls is Iterable:
74 if any("__iter__" in B.__dict__ for B in C.__mro__):
75 return True
76 return NotImplemented
77
Guido van Rossumcd16bf62007-06-13 18:07:49 +000078
Raymond Hettinger74b64952008-02-09 02:53:48 +000079class Iterator(Iterable):
Guido van Rossumcd16bf62007-06-13 18:07:49 +000080
81 @abstractmethod
82 def __next__(self):
83 raise StopIteration
84
85 def __iter__(self):
86 return self
87
88 @classmethod
89 def __subclasshook__(cls, C):
90 if cls is Iterator:
Raymond Hettingeread22222010-11-29 03:56:12 +000091 if (any("__next__" in B.__dict__ for B in C.__mro__) and
92 any("__iter__" in B.__dict__ for B in C.__mro__)):
Guido van Rossumcd16bf62007-06-13 18:07:49 +000093 return True
94 return NotImplemented
95
Christian Heimesf83be4e2007-11-28 09:44:38 +000096Iterator.register(bytes_iterator)
97Iterator.register(bytearray_iterator)
98#Iterator.register(callable_iterator)
99Iterator.register(dict_keyiterator)
100Iterator.register(dict_valueiterator)
101Iterator.register(dict_itemiterator)
102Iterator.register(list_iterator)
103Iterator.register(list_reverseiterator)
104Iterator.register(range_iterator)
105Iterator.register(set_iterator)
106Iterator.register(str_iterator)
107Iterator.register(tuple_iterator)
108Iterator.register(zip_iterator)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000109
110class Sized(metaclass=ABCMeta):
111
112 @abstractmethod
113 def __len__(self):
114 return 0
115
116 @classmethod
117 def __subclasshook__(cls, C):
118 if cls is Sized:
119 if any("__len__" in B.__dict__ for B in C.__mro__):
120 return True
121 return NotImplemented
122
123
124class Container(metaclass=ABCMeta):
125
126 @abstractmethod
127 def __contains__(self, x):
128 return False
129
130 @classmethod
131 def __subclasshook__(cls, C):
132 if cls is Container:
133 if any("__contains__" in B.__dict__ for B in C.__mro__):
134 return True
135 return NotImplemented
136
137
138class Callable(metaclass=ABCMeta):
139
140 @abstractmethod
Christian Heimes78644762008-03-04 23:39:23 +0000141 def __call__(self, *args, **kwds):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000142 return False
143
144 @classmethod
145 def __subclasshook__(cls, C):
146 if cls is Callable:
147 if any("__call__" in B.__dict__ for B in C.__mro__):
148 return True
149 return NotImplemented
150
151
152### SETS ###
153
154
Raymond Hettinger74b64952008-02-09 02:53:48 +0000155class Set(Sized, Iterable, Container):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000156
157 """A set is a finite, iterable container.
158
159 This class provides concrete generic implementations of all
160 methods except for __contains__, __iter__ and __len__.
161
162 To override the comparisons (presumably for speed, as the
163 semantics are fixed), all you have to do is redefine __le__ and
164 then the other operations will automatically follow suit.
165 """
166
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000167 def __le__(self, other):
168 if not isinstance(other, Set):
169 return NotImplemented
170 if len(self) > len(other):
171 return False
172 for elem in self:
173 if elem not in other:
174 return False
175 return True
176
177 def __lt__(self, other):
178 if not isinstance(other, Set):
179 return NotImplemented
180 return len(self) < len(other) and self.__le__(other)
181
Raymond Hettinger71909422008-02-09 00:08:16 +0000182 def __gt__(self, other):
183 if not isinstance(other, Set):
184 return NotImplemented
185 return other < self
186
187 def __ge__(self, other):
188 if not isinstance(other, Set):
189 return NotImplemented
190 return other <= self
191
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000192 def __eq__(self, other):
193 if not isinstance(other, Set):
194 return NotImplemented
195 return len(self) == len(other) and self.__le__(other)
196
Raymond Hettinger71909422008-02-09 00:08:16 +0000197 def __ne__(self, other):
198 return not (self == other)
199
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000200 @classmethod
201 def _from_iterable(cls, it):
Raymond Hettinger8284c4a2008-02-06 20:47:09 +0000202 '''Construct an instance of the class from any iterable input.
203
204 Must override this method if the class constructor signature
Raymond Hettinger7aebb642008-02-09 03:25:08 +0000205 does not accept an iterable for an input.
Raymond Hettinger8284c4a2008-02-06 20:47:09 +0000206 '''
Raymond Hettinger7aebb642008-02-09 03:25:08 +0000207 return cls(it)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000208
209 def __and__(self, other):
210 if not isinstance(other, Iterable):
211 return NotImplemented
212 return self._from_iterable(value for value in other if value in self)
213
Christian Heimes190d79e2008-01-30 11:58:22 +0000214 def isdisjoint(self, other):
215 for value in other:
216 if value in self:
217 return False
218 return True
219
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000220 def __or__(self, other):
221 if not isinstance(other, Iterable):
222 return NotImplemented
Christian Heimes78644762008-03-04 23:39:23 +0000223 chain = (e for s in (self, other) for e in s)
224 return self._from_iterable(chain)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000225
226 def __sub__(self, other):
227 if not isinstance(other, Set):
228 if not isinstance(other, Iterable):
229 return NotImplemented
230 other = self._from_iterable(other)
231 return self._from_iterable(value for value in self
232 if value not in other)
233
234 def __xor__(self, other):
235 if not isinstance(other, Set):
236 if not isinstance(other, Iterable):
237 return NotImplemented
238 other = self._from_iterable(other)
239 return (self - other) | (other - self)
240
241 def _hash(self):
242 """Compute the hash value of a set.
243
244 Note that we don't define __hash__: not all sets are hashable.
245 But if you define a hashable set type, its __hash__ should
246 call this function.
247
248 This must be compatible __eq__.
249
250 All sets ought to compare equal if they contain the same
251 elements, regardless of how they are implemented, and
252 regardless of the order of the elements; so there's not much
253 freedom for __eq__ or __hash__. We match the algorithm used
254 by the built-in frozenset type.
255 """
Christian Heimesa37d4c62007-12-04 23:02:19 +0000256 MAX = sys.maxsize
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000257 MASK = 2 * MAX + 1
258 n = len(self)
259 h = 1927868237 * (n + 1)
260 h &= MASK
261 for x in self:
262 hx = hash(x)
263 h ^= (hx ^ (hx << 16) ^ 89869747) * 3644798167
264 h &= MASK
265 h = h * 69069 + 907133923
266 h &= MASK
267 if h > MAX:
268 h -= MASK + 1
269 if h == -1:
270 h = 590923713
271 return h
272
273Set.register(frozenset)
274
275
276class MutableSet(Set):
277
278 @abstractmethod
279 def add(self, value):
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000280 """Add an element."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000281 raise NotImplementedError
282
283 @abstractmethod
284 def discard(self, value):
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000285 """Remove an element. Do not raise an exception if absent."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000286 raise NotImplementedError
287
Christian Heimes190d79e2008-01-30 11:58:22 +0000288 def remove(self, value):
289 """Remove an element. If not a member, raise a KeyError."""
290 if value not in self:
291 raise KeyError(value)
292 self.discard(value)
293
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000294 def pop(self):
295 """Return the popped value. Raise KeyError if empty."""
296 it = iter(self)
297 try:
Raymond Hettingerae650182009-01-28 23:33:59 +0000298 value = next(it)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000299 except StopIteration:
300 raise KeyError
301 self.discard(value)
302 return value
303
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000304 def clear(self):
305 """This is slow (creates N new iterators!) but effective."""
306 try:
307 while True:
308 self.pop()
309 except KeyError:
310 pass
311
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000312 def __ior__(self, it):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000313 for value in it:
314 self.add(value)
315 return self
316
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000317 def __iand__(self, it):
Raymond Hettinger3f10a952009-04-01 19:05:50 +0000318 for value in (self - it):
319 self.discard(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000320 return self
321
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000322 def __ixor__(self, it):
Daniel Stutzbach31da5b22010-08-24 20:49:57 +0000323 if it is self:
324 self.clear()
325 else:
326 if not isinstance(it, Set):
327 it = self._from_iterable(it)
328 for value in it:
329 if value in self:
330 self.discard(value)
331 else:
332 self.add(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000333 return self
334
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000335 def __isub__(self, it):
Daniel Stutzbach31da5b22010-08-24 20:49:57 +0000336 if it is self:
337 self.clear()
338 else:
339 for value in it:
340 self.discard(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000341 return self
342
343MutableSet.register(set)
344
345
346### MAPPINGS ###
347
348
Raymond Hettinger74b64952008-02-09 02:53:48 +0000349class Mapping(Sized, Iterable, Container):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000350
351 @abstractmethod
352 def __getitem__(self, key):
353 raise KeyError
354
355 def get(self, key, default=None):
356 try:
357 return self[key]
358 except KeyError:
359 return default
360
361 def __contains__(self, key):
362 try:
363 self[key]
364 except KeyError:
365 return False
366 else:
367 return True
368
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000369 def keys(self):
370 return KeysView(self)
371
372 def items(self):
373 return ItemsView(self)
374
375 def values(self):
376 return ValuesView(self)
377
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000378 def __eq__(self, other):
Benjamin Peterson4ad6bd52010-05-21 20:55:22 +0000379 if not isinstance(other, Mapping):
380 return NotImplemented
381 return dict(self.items()) == dict(other.items())
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000382
383 def __ne__(self, other):
Raymond Hettinger554c8b82008-02-05 22:54:43 +0000384 return not (self == other)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000385
Christian Heimes2202f872008-02-06 14:31:34 +0000386
Raymond Hettingerbfd06122008-02-09 10:04:32 +0000387class MappingView(Sized):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000388
389 def __init__(self, mapping):
390 self._mapping = mapping
391
392 def __len__(self):
393 return len(self._mapping)
394
Raymond Hettinger89fc2b72009-02-27 07:47:32 +0000395 def __repr__(self):
396 return '{0.__class__.__name__}({0._mapping!r})'.format(self)
397
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000398
399class KeysView(MappingView, Set):
400
Raymond Hettinger9117c752010-08-22 07:44:24 +0000401 @classmethod
402 def _from_iterable(self, it):
403 return set(it)
404
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000405 def __contains__(self, key):
406 return key in self._mapping
407
408 def __iter__(self):
409 for key in self._mapping:
410 yield key
411
Christian Heimesf83be4e2007-11-28 09:44:38 +0000412KeysView.register(dict_keys)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000413
414
415class ItemsView(MappingView, Set):
416
Raymond Hettinger9117c752010-08-22 07:44:24 +0000417 @classmethod
418 def _from_iterable(self, it):
419 return set(it)
420
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000421 def __contains__(self, item):
422 key, value = item
423 try:
424 v = self._mapping[key]
425 except KeyError:
426 return False
427 else:
428 return v == value
429
430 def __iter__(self):
431 for key in self._mapping:
432 yield (key, self._mapping[key])
433
Christian Heimesf83be4e2007-11-28 09:44:38 +0000434ItemsView.register(dict_items)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000435
436
437class ValuesView(MappingView):
438
439 def __contains__(self, value):
440 for key in self._mapping:
441 if value == self._mapping[key]:
442 return True
443 return False
444
445 def __iter__(self):
446 for key in self._mapping:
447 yield self._mapping[key]
448
Christian Heimesf83be4e2007-11-28 09:44:38 +0000449ValuesView.register(dict_values)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000450
451
452class MutableMapping(Mapping):
453
454 @abstractmethod
455 def __setitem__(self, key, value):
456 raise KeyError
457
458 @abstractmethod
459 def __delitem__(self, key):
460 raise KeyError
461
462 __marker = object()
463
464 def pop(self, key, default=__marker):
465 try:
466 value = self[key]
467 except KeyError:
468 if default is self.__marker:
469 raise
470 return default
471 else:
472 del self[key]
473 return value
474
475 def popitem(self):
476 try:
477 key = next(iter(self))
478 except StopIteration:
479 raise KeyError
480 value = self[key]
481 del self[key]
482 return key, value
483
484 def clear(self):
485 try:
486 while True:
487 self.popitem()
488 except KeyError:
489 pass
490
Mark Dickinsonb214e902010-07-11 18:53:06 +0000491 def update(*args, **kwds):
492 if len(args) > 2:
493 raise TypeError("update() takes at most 2 positional "
494 "arguments ({} given)".format(len(args)))
495 elif not args:
496 raise TypeError("update() takes at least 1 argument (0 given)")
497 self = args[0]
498 other = args[1] if len(args) >= 2 else ()
499
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000500 if isinstance(other, Mapping):
501 for key in other:
502 self[key] = other[key]
503 elif hasattr(other, "keys"):
504 for key in other.keys():
505 self[key] = other[key]
506 else:
507 for key, value in other:
508 self[key] = value
509 for key, value in kwds.items():
510 self[key] = value
511
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000512 def setdefault(self, key, default=None):
513 try:
514 return self[key]
515 except KeyError:
516 self[key] = default
517 return default
518
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000519MutableMapping.register(dict)
520
521
522### SEQUENCES ###
523
524
Raymond Hettinger74b64952008-02-09 02:53:48 +0000525class Sequence(Sized, Iterable, Container):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000526
527 """All the operations on a read-only sequence.
528
529 Concrete subclasses must override __new__ or __init__,
530 __getitem__, and __len__.
531 """
532
533 @abstractmethod
534 def __getitem__(self, index):
535 raise IndexError
536
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000537 def __iter__(self):
538 i = 0
Raymond Hettinger71909422008-02-09 00:08:16 +0000539 try:
540 while True:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000541 v = self[i]
Raymond Hettinger71909422008-02-09 00:08:16 +0000542 yield v
543 i += 1
544 except IndexError:
545 return
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000546
547 def __contains__(self, value):
548 for v in self:
549 if v == value:
550 return True
551 return False
552
553 def __reversed__(self):
554 for i in reversed(range(len(self))):
555 yield self[i]
556
557 def index(self, value):
558 for i, v in enumerate(self):
559 if v == value:
560 return i
561 raise ValueError
562
563 def count(self, value):
564 return sum(1 for v in self if v == value)
565
566Sequence.register(tuple)
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000567Sequence.register(str)
Raymond Hettinger9aa53c22009-02-24 11:25:35 +0000568Sequence.register(range)
Guido van Rossumd05eb002007-11-21 22:26:24 +0000569
570
571class ByteString(Sequence):
572
573 """This unifies bytes and bytearray.
574
575 XXX Should add all their methods.
576 """
577
578ByteString.register(bytes)
579ByteString.register(bytearray)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000580
581
582class MutableSequence(Sequence):
583
584 @abstractmethod
585 def __setitem__(self, index, value):
586 raise IndexError
587
588 @abstractmethod
589 def __delitem__(self, index):
590 raise IndexError
591
592 @abstractmethod
593 def insert(self, index, value):
594 raise IndexError
595
596 def append(self, value):
597 self.insert(len(self), value)
598
599 def reverse(self):
600 n = len(self)
601 for i in range(n//2):
602 self[i], self[n-i-1] = self[n-i-1], self[i]
603
604 def extend(self, values):
605 for v in values:
606 self.append(v)
607
608 def pop(self, index=-1):
609 v = self[index]
610 del self[index]
611 return v
612
613 def remove(self, value):
614 del self[self.index(value)]
615
616 def __iadd__(self, values):
617 self.extend(values)
Raymond Hettingerc384b222009-05-18 15:35:26 +0000618 return self
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000619
620MutableSequence.register(list)
Guido van Rossumd05eb002007-11-21 22:26:24 +0000621MutableSequence.register(bytearray) # Multiply inheriting, see ByteString