blob: e9234af3822acb0f332211ddee3cea297a9cfbb6 [file] [log] [blame]
Guido van Rossum64c06e32007-11-22 00:55:51 +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
7via collections; they are defined here only to alleviate certain
8bootstrapping issues. Unit tests are in test_collections.
9"""
10
11from abc import ABCMeta, abstractmethod
Raymond Hettinger4c52f522008-06-23 03:29:28 +000012import sys
Guido van Rossum64c06e32007-11-22 00:55:51 +000013
14__all__ = ["Hashable", "Iterable", "Iterator",
15 "Sized", "Container", "Callable",
16 "Set", "MutableSet",
17 "Mapping", "MutableMapping",
18 "MappingView", "KeysView", "ItemsView", "ValuesView",
19 "Sequence", "MutableSequence",
20 ]
21
22### ONE-TRICK PONIES ###
23
Florent Xicluna47627d52010-03-08 15:20:28 +000024def _hasattr(C, attr):
25 try:
26 return any(attr in B.__dict__ for B in C.__mro__)
27 except AttributeError:
28 # Old-style class
29 return hasattr(C, attr)
30
31
Guido van Rossum64c06e32007-11-22 00:55:51 +000032class Hashable:
33 __metaclass__ = ABCMeta
34
35 @abstractmethod
36 def __hash__(self):
37 return 0
38
39 @classmethod
40 def __subclasshook__(cls, C):
41 if cls is Hashable:
Florent Xicluna47627d52010-03-08 15:20:28 +000042 try:
43 for B in C.__mro__:
44 if "__hash__" in B.__dict__:
45 if B.__dict__["__hash__"]:
46 return True
47 break
48 except AttributeError:
49 # Old-style class
50 if getattr(C, "__hash__", None):
51 return True
Guido van Rossum64c06e32007-11-22 00:55:51 +000052 return NotImplemented
53
54
55class Iterable:
56 __metaclass__ = ABCMeta
57
58 @abstractmethod
59 def __iter__(self):
60 while False:
61 yield None
62
63 @classmethod
64 def __subclasshook__(cls, C):
65 if cls is Iterable:
Florent Xicluna47627d52010-03-08 15:20:28 +000066 if _hasattr(C, "__iter__"):
Guido van Rossum64c06e32007-11-22 00:55:51 +000067 return True
68 return NotImplemented
69
70Iterable.register(str)
71
72
Raymond Hettingerc2bc0d12008-02-09 01:18:42 +000073class Iterator(Iterable):
Guido van Rossum64c06e32007-11-22 00:55:51 +000074
75 @abstractmethod
Raymond Hettingerf779e6f2009-01-28 23:02:26 +000076 def next(self):
Guido van Rossum64c06e32007-11-22 00:55:51 +000077 raise StopIteration
78
79 def __iter__(self):
80 return self
81
82 @classmethod
83 def __subclasshook__(cls, C):
84 if cls is Iterator:
Florent Xicluna47627d52010-03-08 15:20:28 +000085 if _hasattr(C, "next"):
Guido van Rossum64c06e32007-11-22 00:55:51 +000086 return True
87 return NotImplemented
88
89
90class Sized:
91 __metaclass__ = ABCMeta
92
93 @abstractmethod
94 def __len__(self):
95 return 0
96
97 @classmethod
98 def __subclasshook__(cls, C):
99 if cls is Sized:
Florent Xicluna47627d52010-03-08 15:20:28 +0000100 if _hasattr(C, "__len__"):
Guido van Rossum64c06e32007-11-22 00:55:51 +0000101 return True
102 return NotImplemented
103
104
105class Container:
106 __metaclass__ = ABCMeta
107
108 @abstractmethod
109 def __contains__(self, x):
110 return False
111
112 @classmethod
113 def __subclasshook__(cls, C):
114 if cls is Container:
Florent Xicluna47627d52010-03-08 15:20:28 +0000115 if _hasattr(C, "__contains__"):
Guido van Rossum64c06e32007-11-22 00:55:51 +0000116 return True
117 return NotImplemented
118
119
120class Callable:
121 __metaclass__ = ABCMeta
122
123 @abstractmethod
Raymond Hettinger10ac19b2008-03-03 22:19:58 +0000124 def __call__(self, *args, **kwds):
Guido van Rossum64c06e32007-11-22 00:55:51 +0000125 return False
126
127 @classmethod
128 def __subclasshook__(cls, C):
129 if cls is Callable:
Florent Xicluna47627d52010-03-08 15:20:28 +0000130 if _hasattr(C, "__call__"):
Guido van Rossum64c06e32007-11-22 00:55:51 +0000131 return True
132 return NotImplemented
133
134
135### SETS ###
136
137
Raymond Hettingerc2bc0d12008-02-09 01:18:42 +0000138class Set(Sized, Iterable, Container):
Guido van Rossum64c06e32007-11-22 00:55:51 +0000139 """A set is a finite, iterable container.
140
141 This class provides concrete generic implementations of all
142 methods except for __contains__, __iter__ and __len__.
143
144 To override the comparisons (presumably for speed, as the
145 semantics are fixed), all you have to do is redefine __le__ and
146 then the other operations will automatically follow suit.
147 """
148
Guido van Rossum64c06e32007-11-22 00:55:51 +0000149 def __le__(self, other):
150 if not isinstance(other, Set):
151 return NotImplemented
152 if len(self) > len(other):
153 return False
154 for elem in self:
155 if elem not in other:
156 return False
157 return True
158
159 def __lt__(self, other):
160 if not isinstance(other, Set):
161 return NotImplemented
162 return len(self) < len(other) and self.__le__(other)
163
Raymond Hettingerd53f1c42008-02-08 23:34:21 +0000164 def __gt__(self, other):
165 if not isinstance(other, Set):
166 return NotImplemented
167 return other < self
168
169 def __ge__(self, other):
170 if not isinstance(other, Set):
171 return NotImplemented
172 return other <= self
173
Guido van Rossum64c06e32007-11-22 00:55:51 +0000174 def __eq__(self, other):
175 if not isinstance(other, Set):
176 return NotImplemented
177 return len(self) == len(other) and self.__le__(other)
178
Raymond Hettingerd53f1c42008-02-08 23:34:21 +0000179 def __ne__(self, other):
180 return not (self == other)
181
Guido van Rossum64c06e32007-11-22 00:55:51 +0000182 @classmethod
183 def _from_iterable(cls, it):
Raymond Hettinger017b6a32008-02-07 03:10:33 +0000184 '''Construct an instance of the class from any iterable input.
185
186 Must override this method if the class constructor signature
Raymond Hettinger2e827bf2008-02-09 03:34:52 +0000187 does not accept an iterable for an input.
Raymond Hettinger017b6a32008-02-07 03:10:33 +0000188 '''
Raymond Hettinger2e827bf2008-02-09 03:34:52 +0000189 return cls(it)
Guido van Rossum64c06e32007-11-22 00:55:51 +0000190
191 def __and__(self, other):
192 if not isinstance(other, Iterable):
193 return NotImplemented
194 return self._from_iterable(value for value in other if value in self)
195
Raymond Hettingerabf3fcf2008-01-30 00:01:07 +0000196 def isdisjoint(self, other):
197 for value in other:
198 if value in self:
199 return False
200 return True
201
Guido van Rossum64c06e32007-11-22 00:55:51 +0000202 def __or__(self, other):
203 if not isinstance(other, Iterable):
204 return NotImplemented
Raymond Hettinger972fb072008-03-03 22:04:55 +0000205 chain = (e for s in (self, other) for e in s)
206 return self._from_iterable(chain)
Guido van Rossum64c06e32007-11-22 00:55:51 +0000207
208 def __sub__(self, other):
209 if not isinstance(other, Set):
210 if not isinstance(other, Iterable):
211 return NotImplemented
212 other = self._from_iterable(other)
213 return self._from_iterable(value for value in self
214 if value not in other)
215
216 def __xor__(self, other):
217 if not isinstance(other, Set):
218 if not isinstance(other, Iterable):
219 return NotImplemented
220 other = self._from_iterable(other)
221 return (self - other) | (other - self)
222
Nick Coghlan48361f52008-08-11 15:45:58 +0000223 # Sets are not hashable by default, but subclasses can change this
224 __hash__ = None
225
Guido van Rossum64c06e32007-11-22 00:55:51 +0000226 def _hash(self):
227 """Compute the hash value of a set.
228
229 Note that we don't define __hash__: not all sets are hashable.
230 But if you define a hashable set type, its __hash__ should
231 call this function.
232
233 This must be compatible __eq__.
234
235 All sets ought to compare equal if they contain the same
236 elements, regardless of how they are implemented, and
237 regardless of the order of the elements; so there's not much
238 freedom for __eq__ or __hash__. We match the algorithm used
239 by the built-in frozenset type.
240 """
241 MAX = sys.maxint
242 MASK = 2 * MAX + 1
243 n = len(self)
244 h = 1927868237 * (n + 1)
245 h &= MASK
246 for x in self:
247 hx = hash(x)
248 h ^= (hx ^ (hx << 16) ^ 89869747) * 3644798167
249 h &= MASK
250 h = h * 69069 + 907133923
251 h &= MASK
252 if h > MAX:
253 h -= MASK + 1
254 if h == -1:
255 h = 590923713
256 return h
257
258Set.register(frozenset)
259
260
261class MutableSet(Set):
262
263 @abstractmethod
264 def add(self, value):
Raymond Hettinger2d21d502009-01-13 09:08:32 +0000265 """Add an element."""
Guido van Rossum64c06e32007-11-22 00:55:51 +0000266 raise NotImplementedError
267
268 @abstractmethod
269 def discard(self, value):
Raymond Hettinger2d21d502009-01-13 09:08:32 +0000270 """Remove an element. Do not raise an exception if absent."""
Guido van Rossum64c06e32007-11-22 00:55:51 +0000271 raise NotImplementedError
272
Raymond Hettinger7d518f42008-01-30 00:08:31 +0000273 def remove(self, value):
274 """Remove an element. If not a member, raise a KeyError."""
275 if value not in self:
276 raise KeyError(value)
277 self.discard(value)
278
Guido van Rossum64c06e32007-11-22 00:55:51 +0000279 def pop(self):
280 """Return the popped value. Raise KeyError if empty."""
281 it = iter(self)
282 try:
Raymond Hettingerf779e6f2009-01-28 23:02:26 +0000283 value = next(it)
Guido van Rossum64c06e32007-11-22 00:55:51 +0000284 except StopIteration:
285 raise KeyError
286 self.discard(value)
287 return value
288
Guido van Rossum64c06e32007-11-22 00:55:51 +0000289 def clear(self):
290 """This is slow (creates N new iterators!) but effective."""
291 try:
292 while True:
293 self.pop()
294 except KeyError:
295 pass
296
297 def __ior__(self, it):
298 for value in it:
299 self.add(value)
300 return self
301
Raymond Hettinger66c4a6b2009-04-01 18:50:56 +0000302 def __iand__(self, it):
303 for value in (self - it):
304 self.discard(value)
Guido van Rossum64c06e32007-11-22 00:55:51 +0000305 return self
306
307 def __ixor__(self, it):
Raymond Hettingere67420d2008-01-31 01:38:15 +0000308 if not isinstance(it, Set):
309 it = self._from_iterable(it)
Guido van Rossum64c06e32007-11-22 00:55:51 +0000310 for value in it:
Raymond Hettingere67420d2008-01-31 01:38:15 +0000311 if value in self:
312 self.discard(value)
313 else:
314 self.add(value)
Raymond Hettingere973c612008-01-31 01:42:11 +0000315 return self
Guido van Rossum64c06e32007-11-22 00:55:51 +0000316
317 def __isub__(self, it):
318 for value in it:
319 self.discard(value)
320 return self
321
322MutableSet.register(set)
323
324
325### MAPPINGS ###
326
327
Raymond Hettingerc2bc0d12008-02-09 01:18:42 +0000328class Mapping(Sized, Iterable, Container):
Guido van Rossum64c06e32007-11-22 00:55:51 +0000329
330 @abstractmethod
331 def __getitem__(self, key):
332 raise KeyError
333
334 def get(self, key, default=None):
335 try:
336 return self[key]
337 except KeyError:
338 return default
339
340 def __contains__(self, key):
341 try:
342 self[key]
343 except KeyError:
344 return False
345 else:
346 return True
347
Georg Brandl60fbf7f2008-06-07 17:03:28 +0000348 def iterkeys(self):
349 return iter(self)
350
351 def itervalues(self):
352 for key in self:
353 yield self[key]
354
355 def iteritems(self):
356 for key in self:
357 yield (key, self[key])
358
Guido van Rossum64c06e32007-11-22 00:55:51 +0000359 def keys(self):
Georg Brandl60fbf7f2008-06-07 17:03:28 +0000360 return list(self)
Guido van Rossum64c06e32007-11-22 00:55:51 +0000361
362 def items(self):
Georg Brandl60fbf7f2008-06-07 17:03:28 +0000363 return [(key, self[key]) for key in self]
Guido van Rossum64c06e32007-11-22 00:55:51 +0000364
365 def values(self):
Georg Brandl60fbf7f2008-06-07 17:03:28 +0000366 return [self[key] for key in self]
Guido van Rossum64c06e32007-11-22 00:55:51 +0000367
Nick Coghlan48361f52008-08-11 15:45:58 +0000368 # Mappings are not hashable by default, but subclasses can change this
369 __hash__ = None
370
Raymond Hettinger45eda642008-02-06 01:49:00 +0000371 def __eq__(self, other):
Benjamin Petersoneb318d32010-05-21 20:51:45 +0000372 if not isinstance(other, Mapping):
373 return NotImplemented
374 return dict(self.items()) == dict(other.items())
Raymond Hettinger45eda642008-02-06 01:49:00 +0000375
376 def __ne__(self, other):
377 return not (self == other)
Guido van Rossum64c06e32007-11-22 00:55:51 +0000378
Raymond Hettingerc2bc0d12008-02-09 01:18:42 +0000379class MappingView(Sized):
Guido van Rossum64c06e32007-11-22 00:55:51 +0000380
381 def __init__(self, mapping):
382 self._mapping = mapping
383
384 def __len__(self):
385 return len(self._mapping)
386
Raymond Hettingerb31a6d02009-02-27 08:09:47 +0000387 def __repr__(self):
388 return '{0.__class__.__name__}({0._mapping!r})'.format(self)
389
Guido van Rossum64c06e32007-11-22 00:55:51 +0000390
391class KeysView(MappingView, Set):
392
Raymond Hettinger917bba12010-08-22 08:01:58 +0000393 @classmethod
394 def _from_iterable(self, it):
395 return set(it)
396
Guido van Rossum64c06e32007-11-22 00:55:51 +0000397 def __contains__(self, key):
398 return key in self._mapping
399
400 def __iter__(self):
401 for key in self._mapping:
402 yield key
403
Guido van Rossum64c06e32007-11-22 00:55:51 +0000404
405class ItemsView(MappingView, Set):
406
Raymond Hettinger917bba12010-08-22 08:01:58 +0000407 @classmethod
408 def _from_iterable(self, it):
409 return set(it)
410
Guido van Rossum64c06e32007-11-22 00:55:51 +0000411 def __contains__(self, item):
412 key, value = item
413 try:
414 v = self._mapping[key]
415 except KeyError:
416 return False
417 else:
418 return v == value
419
420 def __iter__(self):
421 for key in self._mapping:
422 yield (key, self._mapping[key])
423
Guido van Rossum64c06e32007-11-22 00:55:51 +0000424
425class ValuesView(MappingView):
426
427 def __contains__(self, value):
428 for key in self._mapping:
429 if value == self._mapping[key]:
430 return True
431 return False
432
433 def __iter__(self):
434 for key in self._mapping:
435 yield self._mapping[key]
436
Guido van Rossum64c06e32007-11-22 00:55:51 +0000437
438class MutableMapping(Mapping):
439
440 @abstractmethod
441 def __setitem__(self, key, value):
442 raise KeyError
443
444 @abstractmethod
445 def __delitem__(self, key):
446 raise KeyError
447
448 __marker = object()
449
450 def pop(self, key, default=__marker):
451 try:
452 value = self[key]
453 except KeyError:
454 if default is self.__marker:
455 raise
456 return default
457 else:
458 del self[key]
459 return value
460
461 def popitem(self):
462 try:
463 key = next(iter(self))
464 except StopIteration:
465 raise KeyError
466 value = self[key]
467 del self[key]
468 return key, value
469
470 def clear(self):
471 try:
472 while True:
473 self.popitem()
474 except KeyError:
475 pass
476
Mark Dickinson42add992010-07-11 19:17:28 +0000477 def update(*args, **kwds):
478 if len(args) > 2:
479 raise TypeError("update() takes at most 2 positional "
480 "arguments ({} given)".format(len(args)))
481 elif not args:
482 raise TypeError("update() takes at least 1 argument (0 given)")
483 self = args[0]
484 other = args[1] if len(args) >= 2 else ()
485
Guido van Rossum64c06e32007-11-22 00:55:51 +0000486 if isinstance(other, Mapping):
487 for key in other:
488 self[key] = other[key]
489 elif hasattr(other, "keys"):
490 for key in other.keys():
491 self[key] = other[key]
492 else:
493 for key, value in other:
494 self[key] = value
495 for key, value in kwds.items():
496 self[key] = value
497
Raymond Hettinger45eda642008-02-06 01:49:00 +0000498 def setdefault(self, key, default=None):
499 try:
500 return self[key]
501 except KeyError:
502 self[key] = default
503 return default
504
Guido van Rossum64c06e32007-11-22 00:55:51 +0000505MutableMapping.register(dict)
506
507
508### SEQUENCES ###
509
510
Raymond Hettingerc2bc0d12008-02-09 01:18:42 +0000511class Sequence(Sized, Iterable, Container):
Guido van Rossum64c06e32007-11-22 00:55:51 +0000512 """All the operations on a read-only sequence.
513
514 Concrete subclasses must override __new__ or __init__,
515 __getitem__, and __len__.
516 """
517
518 @abstractmethod
519 def __getitem__(self, index):
520 raise IndexError
521
Guido van Rossum64c06e32007-11-22 00:55:51 +0000522 def __iter__(self):
523 i = 0
Raymond Hettinger18a1ffc2008-02-08 23:02:27 +0000524 try:
525 while True:
Guido van Rossum64c06e32007-11-22 00:55:51 +0000526 v = self[i]
Raymond Hettinger18a1ffc2008-02-08 23:02:27 +0000527 yield v
528 i += 1
529 except IndexError:
530 return
Guido van Rossum64c06e32007-11-22 00:55:51 +0000531
532 def __contains__(self, value):
533 for v in self:
534 if v == value:
535 return True
536 return False
537
538 def __reversed__(self):
539 for i in reversed(range(len(self))):
540 yield self[i]
541
542 def index(self, value):
543 for i, v in enumerate(self):
544 if v == value:
545 return i
546 raise ValueError
547
548 def count(self, value):
549 return sum(1 for v in self if v == value)
550
551Sequence.register(tuple)
552Sequence.register(basestring)
553Sequence.register(buffer)
Raymond Hettinger8c56f882009-02-24 12:23:23 +0000554Sequence.register(xrange)
Guido van Rossum64c06e32007-11-22 00:55:51 +0000555
556
557class MutableSequence(Sequence):
558
559 @abstractmethod
560 def __setitem__(self, index, value):
561 raise IndexError
562
563 @abstractmethod
564 def __delitem__(self, index):
565 raise IndexError
566
567 @abstractmethod
568 def insert(self, index, value):
569 raise IndexError
570
571 def append(self, value):
572 self.insert(len(self), value)
573
574 def reverse(self):
575 n = len(self)
576 for i in range(n//2):
577 self[i], self[n-i-1] = self[n-i-1], self[i]
578
579 def extend(self, values):
580 for v in values:
581 self.append(v)
582
583 def pop(self, index=-1):
584 v = self[index]
585 del self[index]
586 return v
587
588 def remove(self, value):
589 del self[self.index(value)]
590
591 def __iadd__(self, values):
592 self.extend(values)
Raymond Hettingerfceb5d42009-05-18 15:51:59 +0000593 return self
Guido van Rossum64c06e32007-11-22 00:55:51 +0000594
595MutableSequence.register(list)