blob: cac06e0825f48bd55cbdb5fddacff0fd116aa128 [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
6DON'T USE THIS MODULE DIRECTLY! The classes here should be imported
Guido van Rossum7eaf8222007-06-18 17:58:50 +00007via collections; they are defined here only to alleviate certain
Guido van Rossumcd16bf62007-06-13 18:07:49 +00008bootstrapping issues. Unit tests are in test_collections.
9"""
10
11from abc import ABCMeta, abstractmethod
Benjamin Peterson41181742008-07-02 20:22:54 +000012import sys
Guido van Rossumcd16bf62007-06-13 18:07:49 +000013
14__all__ = ["Hashable", "Iterable", "Iterator",
15 "Sized", "Container", "Callable",
16 "Set", "MutableSet",
17 "Mapping", "MutableMapping",
18 "MappingView", "KeysView", "ItemsView", "ValuesView",
19 "Sequence", "MutableSequence",
Guido van Rossumd05eb002007-11-21 22:26:24 +000020 "ByteString",
Guido van Rossumcd16bf62007-06-13 18:07:49 +000021 ]
22
Christian Heimesf83be4e2007-11-28 09:44:38 +000023
24### collection related types which are not exposed through builtin ###
25## iterators ##
26bytes_iterator = type(iter(b''))
27bytearray_iterator = type(iter(bytearray()))
28#callable_iterator = ???
29dict_keyiterator = type(iter({}.keys()))
30dict_valueiterator = type(iter({}.values()))
31dict_itemiterator = type(iter({}.items()))
32list_iterator = type(iter([]))
33list_reverseiterator = type(iter(reversed([])))
34range_iterator = type(iter(range(0)))
35set_iterator = type(iter(set()))
36str_iterator = type(iter(""))
37tuple_iterator = type(iter(()))
38zip_iterator = type(iter(zip()))
39## views ##
40dict_keys = type({}.keys())
41dict_values = type({}.values())
42dict_items = type({}.items())
Christian Heimes0db38532007-11-29 16:21:13 +000043## misc ##
44dict_proxy = type(type.__dict__)
Christian Heimesf83be4e2007-11-28 09:44:38 +000045
46
Guido van Rossumcd16bf62007-06-13 18:07:49 +000047### ONE-TRICK PONIES ###
48
49class Hashable(metaclass=ABCMeta):
50
51 @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
68 @abstractmethod
69 def __iter__(self):
70 while False:
71 yield None
72
73 @classmethod
74 def __subclasshook__(cls, C):
75 if cls is Iterable:
76 if any("__iter__" in B.__dict__ for B in C.__mro__):
77 return True
78 return NotImplemented
79
Guido van Rossumcd16bf62007-06-13 18:07:49 +000080
Raymond Hettinger74b64952008-02-09 02:53:48 +000081class Iterator(Iterable):
Guido van Rossumcd16bf62007-06-13 18:07:49 +000082
83 @abstractmethod
84 def __next__(self):
85 raise StopIteration
86
87 def __iter__(self):
88 return self
89
90 @classmethod
91 def __subclasshook__(cls, C):
92 if cls is Iterator:
93 if any("__next__" in B.__dict__ for B in C.__mro__):
94 return True
95 return NotImplemented
96
Christian Heimesf83be4e2007-11-28 09:44:38 +000097Iterator.register(bytes_iterator)
98Iterator.register(bytearray_iterator)
99#Iterator.register(callable_iterator)
100Iterator.register(dict_keyiterator)
101Iterator.register(dict_valueiterator)
102Iterator.register(dict_itemiterator)
103Iterator.register(list_iterator)
104Iterator.register(list_reverseiterator)
105Iterator.register(range_iterator)
106Iterator.register(set_iterator)
107Iterator.register(str_iterator)
108Iterator.register(tuple_iterator)
109Iterator.register(zip_iterator)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000110
111class Sized(metaclass=ABCMeta):
112
113 @abstractmethod
114 def __len__(self):
115 return 0
116
117 @classmethod
118 def __subclasshook__(cls, C):
119 if cls is Sized:
120 if any("__len__" in B.__dict__ for B in C.__mro__):
121 return True
122 return NotImplemented
123
124
125class Container(metaclass=ABCMeta):
126
127 @abstractmethod
128 def __contains__(self, x):
129 return False
130
131 @classmethod
132 def __subclasshook__(cls, C):
133 if cls is Container:
134 if any("__contains__" in B.__dict__ for B in C.__mro__):
135 return True
136 return NotImplemented
137
138
139class Callable(metaclass=ABCMeta):
140
141 @abstractmethod
Christian Heimes78644762008-03-04 23:39:23 +0000142 def __call__(self, *args, **kwds):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000143 return False
144
145 @classmethod
146 def __subclasshook__(cls, C):
147 if cls is Callable:
148 if any("__call__" in B.__dict__ for B in C.__mro__):
149 return True
150 return NotImplemented
151
152
153### SETS ###
154
155
Raymond Hettinger74b64952008-02-09 02:53:48 +0000156class Set(Sized, Iterable, Container):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000157
158 """A set is a finite, iterable container.
159
160 This class provides concrete generic implementations of all
161 methods except for __contains__, __iter__ and __len__.
162
163 To override the comparisons (presumably for speed, as the
164 semantics are fixed), all you have to do is redefine __le__ and
165 then the other operations will automatically follow suit.
166 """
167
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000168 def __le__(self, other):
169 if not isinstance(other, Set):
170 return NotImplemented
171 if len(self) > len(other):
172 return False
173 for elem in self:
174 if elem not in other:
175 return False
176 return True
177
178 def __lt__(self, other):
179 if not isinstance(other, Set):
180 return NotImplemented
181 return len(self) < len(other) and self.__le__(other)
182
Raymond Hettinger71909422008-02-09 00:08:16 +0000183 def __gt__(self, other):
184 if not isinstance(other, Set):
185 return NotImplemented
186 return other < self
187
188 def __ge__(self, other):
189 if not isinstance(other, Set):
190 return NotImplemented
191 return other <= self
192
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000193 def __eq__(self, other):
194 if not isinstance(other, Set):
195 return NotImplemented
196 return len(self) == len(other) and self.__le__(other)
197
Raymond Hettinger71909422008-02-09 00:08:16 +0000198 def __ne__(self, other):
199 return not (self == other)
200
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000201 @classmethod
202 def _from_iterable(cls, it):
Raymond Hettinger8284c4a2008-02-06 20:47:09 +0000203 '''Construct an instance of the class from any iterable input.
204
205 Must override this method if the class constructor signature
Raymond Hettinger7aebb642008-02-09 03:25:08 +0000206 does not accept an iterable for an input.
Raymond Hettinger8284c4a2008-02-06 20:47:09 +0000207 '''
Raymond Hettinger7aebb642008-02-09 03:25:08 +0000208 return cls(it)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000209
210 def __and__(self, other):
211 if not isinstance(other, Iterable):
212 return NotImplemented
213 return self._from_iterable(value for value in other if value in self)
214
Christian Heimes190d79e2008-01-30 11:58:22 +0000215 def isdisjoint(self, other):
216 for value in other:
217 if value in self:
218 return False
219 return True
220
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000221 def __or__(self, other):
222 if not isinstance(other, Iterable):
223 return NotImplemented
Christian Heimes78644762008-03-04 23:39:23 +0000224 chain = (e for s in (self, other) for e in s)
225 return self._from_iterable(chain)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000226
227 def __sub__(self, other):
228 if not isinstance(other, Set):
229 if not isinstance(other, Iterable):
230 return NotImplemented
231 other = self._from_iterable(other)
232 return self._from_iterable(value for value in self
233 if value not in other)
234
235 def __xor__(self, other):
236 if not isinstance(other, Set):
237 if not isinstance(other, Iterable):
238 return NotImplemented
239 other = self._from_iterable(other)
240 return (self - other) | (other - self)
241
242 def _hash(self):
243 """Compute the hash value of a set.
244
245 Note that we don't define __hash__: not all sets are hashable.
246 But if you define a hashable set type, its __hash__ should
247 call this function.
248
249 This must be compatible __eq__.
250
251 All sets ought to compare equal if they contain the same
252 elements, regardless of how they are implemented, and
253 regardless of the order of the elements; so there's not much
254 freedom for __eq__ or __hash__. We match the algorithm used
255 by the built-in frozenset type.
256 """
Christian Heimesa37d4c62007-12-04 23:02:19 +0000257 MAX = sys.maxsize
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000258 MASK = 2 * MAX + 1
259 n = len(self)
260 h = 1927868237 * (n + 1)
261 h &= MASK
262 for x in self:
263 hx = hash(x)
264 h ^= (hx ^ (hx << 16) ^ 89869747) * 3644798167
265 h &= MASK
266 h = h * 69069 + 907133923
267 h &= MASK
268 if h > MAX:
269 h -= MASK + 1
270 if h == -1:
271 h = 590923713
272 return h
273
274Set.register(frozenset)
275
276
277class MutableSet(Set):
278
279 @abstractmethod
280 def add(self, value):
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000281 """Add an element."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000282 raise NotImplementedError
283
284 @abstractmethod
285 def discard(self, value):
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000286 """Remove an element. Do not raise an exception if absent."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000287 raise NotImplementedError
288
Christian Heimes190d79e2008-01-30 11:58:22 +0000289 def remove(self, value):
290 """Remove an element. If not a member, raise a KeyError."""
291 if value not in self:
292 raise KeyError(value)
293 self.discard(value)
294
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000295 def pop(self):
296 """Return the popped value. Raise KeyError if empty."""
297 it = iter(self)
298 try:
Raymond Hettingerae650182009-01-28 23:33:59 +0000299 value = next(it)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000300 except StopIteration:
301 raise KeyError
302 self.discard(value)
303 return value
304
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000305 def clear(self):
306 """This is slow (creates N new iterators!) but effective."""
307 try:
308 while True:
309 self.pop()
310 except KeyError:
311 pass
312
313 def __ior__(self, it: Iterable):
314 for value in it:
315 self.add(value)
316 return self
317
Raymond Hettinger3f10a952009-04-01 19:05:50 +0000318 def __iand__(self, it: Iterable):
319 for value in (self - it):
320 self.discard(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000321 return self
322
323 def __ixor__(self, it: Iterable):
Daniel Stutzbache21624f2010-08-24 21:00:32 +0000324 if it is self:
325 self.clear()
326 else:
327 if not isinstance(it, Set):
328 it = self._from_iterable(it)
329 for value in it:
330 if value in self:
331 self.discard(value)
332 else:
333 self.add(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000334 return self
335
336 def __isub__(self, it: Iterable):
Daniel Stutzbache21624f2010-08-24 21:00:32 +0000337 if it is self:
338 self.clear()
339 else:
340 for value in it:
341 self.discard(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000342 return self
343
344MutableSet.register(set)
345
346
347### MAPPINGS ###
348
349
Raymond Hettinger74b64952008-02-09 02:53:48 +0000350class Mapping(Sized, Iterable, Container):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000351
352 @abstractmethod
353 def __getitem__(self, key):
354 raise KeyError
355
356 def get(self, key, default=None):
357 try:
358 return self[key]
359 except KeyError:
360 return default
361
362 def __contains__(self, key):
363 try:
364 self[key]
365 except KeyError:
366 return False
367 else:
368 return True
369
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000370 def keys(self):
371 return KeysView(self)
372
373 def items(self):
374 return ItemsView(self)
375
376 def values(self):
377 return ValuesView(self)
378
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000379 def __eq__(self, other):
Benjamin Peterson8e13de62010-05-21 21:05:45 +0000380 if not isinstance(other, Mapping):
381 return NotImplemented
382 return dict(self.items()) == dict(other.items())
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000383
384 def __ne__(self, other):
Raymond Hettinger554c8b82008-02-05 22:54:43 +0000385 return not (self == other)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000386
Christian Heimes2202f872008-02-06 14:31:34 +0000387
Raymond Hettingerbfd06122008-02-09 10:04:32 +0000388class MappingView(Sized):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000389
390 def __init__(self, mapping):
391 self._mapping = mapping
392
393 def __len__(self):
394 return len(self._mapping)
395
Raymond Hettinger89fc2b72009-02-27 07:47:32 +0000396 def __repr__(self):
397 return '{0.__class__.__name__}({0._mapping!r})'.format(self)
398
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000399
400class KeysView(MappingView, Set):
401
Raymond Hettinger0e708a12010-08-22 07:56:20 +0000402 @classmethod
403 def _from_iterable(self, it):
404 return set(it)
405
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000406 def __contains__(self, key):
407 return key in self._mapping
408
409 def __iter__(self):
410 for key in self._mapping:
411 yield key
412
Christian Heimesf83be4e2007-11-28 09:44:38 +0000413KeysView.register(dict_keys)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000414
415
416class ItemsView(MappingView, Set):
417
Raymond Hettinger0e708a12010-08-22 07:56:20 +0000418 @classmethod
419 def _from_iterable(self, it):
420 return set(it)
421
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000422 def __contains__(self, item):
423 key, value = item
424 try:
425 v = self._mapping[key]
426 except KeyError:
427 return False
428 else:
429 return v == value
430
431 def __iter__(self):
432 for key in self._mapping:
433 yield (key, self._mapping[key])
434
Christian Heimesf83be4e2007-11-28 09:44:38 +0000435ItemsView.register(dict_items)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000436
437
438class ValuesView(MappingView):
439
440 def __contains__(self, value):
441 for key in self._mapping:
442 if value == self._mapping[key]:
443 return True
444 return False
445
446 def __iter__(self):
447 for key in self._mapping:
448 yield self._mapping[key]
449
Christian Heimesf83be4e2007-11-28 09:44:38 +0000450ValuesView.register(dict_values)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000451
452
453class MutableMapping(Mapping):
454
455 @abstractmethod
456 def __setitem__(self, key, value):
457 raise KeyError
458
459 @abstractmethod
460 def __delitem__(self, key):
461 raise KeyError
462
463 __marker = object()
464
465 def pop(self, key, default=__marker):
466 try:
467 value = self[key]
468 except KeyError:
469 if default is self.__marker:
470 raise
471 return default
472 else:
473 del self[key]
474 return value
475
476 def popitem(self):
477 try:
478 key = next(iter(self))
479 except StopIteration:
480 raise KeyError
481 value = self[key]
482 del self[key]
483 return key, value
484
485 def clear(self):
486 try:
487 while True:
488 self.popitem()
489 except KeyError:
490 pass
491
Mark Dickinson16d03762010-07-11 19:27:06 +0000492 def update(*args, **kwds):
493 if len(args) > 2:
494 raise TypeError("update() takes at most 2 positional "
495 "arguments ({} given)".format(len(args)))
496 elif not args:
497 raise TypeError("update() takes at least 1 argument (0 given)")
498 self = args[0]
499 other = args[1] if len(args) >= 2 else ()
500
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000501 if isinstance(other, Mapping):
502 for key in other:
503 self[key] = other[key]
504 elif hasattr(other, "keys"):
505 for key in other.keys():
506 self[key] = other[key]
507 else:
508 for key, value in other:
509 self[key] = value
510 for key, value in kwds.items():
511 self[key] = value
512
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000513 def setdefault(self, key, default=None):
514 try:
515 return self[key]
516 except KeyError:
517 self[key] = default
518 return default
519
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000520MutableMapping.register(dict)
521
522
523### SEQUENCES ###
524
525
Raymond Hettinger74b64952008-02-09 02:53:48 +0000526class Sequence(Sized, Iterable, Container):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000527
528 """All the operations on a read-only sequence.
529
530 Concrete subclasses must override __new__ or __init__,
531 __getitem__, and __len__.
532 """
533
534 @abstractmethod
535 def __getitem__(self, index):
536 raise IndexError
537
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000538 def __iter__(self):
539 i = 0
Raymond Hettinger71909422008-02-09 00:08:16 +0000540 try:
541 while True:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000542 v = self[i]
Raymond Hettinger71909422008-02-09 00:08:16 +0000543 yield v
544 i += 1
545 except IndexError:
546 return
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000547
548 def __contains__(self, value):
549 for v in self:
550 if v == value:
551 return True
552 return False
553
554 def __reversed__(self):
555 for i in reversed(range(len(self))):
556 yield self[i]
557
558 def index(self, value):
559 for i, v in enumerate(self):
560 if v == value:
561 return i
562 raise ValueError
563
564 def count(self, value):
565 return sum(1 for v in self if v == value)
566
567Sequence.register(tuple)
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000568Sequence.register(str)
Raymond Hettinger9aa53c22009-02-24 11:25:35 +0000569Sequence.register(range)
Guido van Rossumd05eb002007-11-21 22:26:24 +0000570
571
572class ByteString(Sequence):
573
574 """This unifies bytes and bytearray.
575
576 XXX Should add all their methods.
577 """
578
579ByteString.register(bytes)
580ByteString.register(bytearray)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000581
582
583class MutableSequence(Sequence):
584
585 @abstractmethod
586 def __setitem__(self, index, value):
587 raise IndexError
588
589 @abstractmethod
590 def __delitem__(self, index):
591 raise IndexError
592
593 @abstractmethod
594 def insert(self, index, value):
595 raise IndexError
596
597 def append(self, value):
598 self.insert(len(self), value)
599
600 def reverse(self):
601 n = len(self)
602 for i in range(n//2):
603 self[i], self[n-i-1] = self[n-i-1], self[i]
604
605 def extend(self, values):
606 for v in values:
607 self.append(v)
608
609 def pop(self, index=-1):
610 v = self[index]
611 del self[index]
612 return v
613
614 def remove(self, value):
615 del self[self.index(value)]
616
617 def __iadd__(self, values):
618 self.extend(values)
Raymond Hettingerc384b222009-05-18 15:35:26 +0000619 return self
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000620
621MutableSequence.register(list)
Guido van Rossumd05eb002007-11-21 22:26:24 +0000622MutableSequence.register(bytearray) # Multiply inheriting, see ByteString