blob: 326c1f9b50bc8d934dbd5cbdb65ac598583029d3 [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):
372 return isinstance(other, Mapping) and \
373 dict(self.items()) == dict(other.items())
374
375 def __ne__(self, other):
376 return not (self == other)
Guido van Rossum64c06e32007-11-22 00:55:51 +0000377
Raymond Hettingerc2bc0d12008-02-09 01:18:42 +0000378class MappingView(Sized):
Guido van Rossum64c06e32007-11-22 00:55:51 +0000379
380 def __init__(self, mapping):
381 self._mapping = mapping
382
383 def __len__(self):
384 return len(self._mapping)
385
Raymond Hettingerb31a6d02009-02-27 08:09:47 +0000386 def __repr__(self):
387 return '{0.__class__.__name__}({0._mapping!r})'.format(self)
388
Guido van Rossum64c06e32007-11-22 00:55:51 +0000389
390class KeysView(MappingView, Set):
391
392 def __contains__(self, key):
393 return key in self._mapping
394
395 def __iter__(self):
396 for key in self._mapping:
397 yield key
398
Guido van Rossum64c06e32007-11-22 00:55:51 +0000399
400class ItemsView(MappingView, Set):
401
402 def __contains__(self, item):
403 key, value = item
404 try:
405 v = self._mapping[key]
406 except KeyError:
407 return False
408 else:
409 return v == value
410
411 def __iter__(self):
412 for key in self._mapping:
413 yield (key, self._mapping[key])
414
Guido van Rossum64c06e32007-11-22 00:55:51 +0000415
416class ValuesView(MappingView):
417
418 def __contains__(self, value):
419 for key in self._mapping:
420 if value == self._mapping[key]:
421 return True
422 return False
423
424 def __iter__(self):
425 for key in self._mapping:
426 yield self._mapping[key]
427
Guido van Rossum64c06e32007-11-22 00:55:51 +0000428
429class MutableMapping(Mapping):
430
431 @abstractmethod
432 def __setitem__(self, key, value):
433 raise KeyError
434
435 @abstractmethod
436 def __delitem__(self, key):
437 raise KeyError
438
439 __marker = object()
440
441 def pop(self, key, default=__marker):
442 try:
443 value = self[key]
444 except KeyError:
445 if default is self.__marker:
446 raise
447 return default
448 else:
449 del self[key]
450 return value
451
452 def popitem(self):
453 try:
454 key = next(iter(self))
455 except StopIteration:
456 raise KeyError
457 value = self[key]
458 del self[key]
459 return key, value
460
461 def clear(self):
462 try:
463 while True:
464 self.popitem()
465 except KeyError:
466 pass
467
468 def update(self, other=(), **kwds):
469 if isinstance(other, Mapping):
470 for key in other:
471 self[key] = other[key]
472 elif hasattr(other, "keys"):
473 for key in other.keys():
474 self[key] = other[key]
475 else:
476 for key, value in other:
477 self[key] = value
478 for key, value in kwds.items():
479 self[key] = value
480
Raymond Hettinger45eda642008-02-06 01:49:00 +0000481 def setdefault(self, key, default=None):
482 try:
483 return self[key]
484 except KeyError:
485 self[key] = default
486 return default
487
Guido van Rossum64c06e32007-11-22 00:55:51 +0000488MutableMapping.register(dict)
489
490
491### SEQUENCES ###
492
493
Raymond Hettingerc2bc0d12008-02-09 01:18:42 +0000494class Sequence(Sized, Iterable, Container):
Guido van Rossum64c06e32007-11-22 00:55:51 +0000495 """All the operations on a read-only sequence.
496
497 Concrete subclasses must override __new__ or __init__,
498 __getitem__, and __len__.
499 """
500
501 @abstractmethod
502 def __getitem__(self, index):
503 raise IndexError
504
Guido van Rossum64c06e32007-11-22 00:55:51 +0000505 def __iter__(self):
506 i = 0
Raymond Hettinger18a1ffc2008-02-08 23:02:27 +0000507 try:
508 while True:
Guido van Rossum64c06e32007-11-22 00:55:51 +0000509 v = self[i]
Raymond Hettinger18a1ffc2008-02-08 23:02:27 +0000510 yield v
511 i += 1
512 except IndexError:
513 return
Guido van Rossum64c06e32007-11-22 00:55:51 +0000514
515 def __contains__(self, value):
516 for v in self:
517 if v == value:
518 return True
519 return False
520
521 def __reversed__(self):
522 for i in reversed(range(len(self))):
523 yield self[i]
524
525 def index(self, value):
526 for i, v in enumerate(self):
527 if v == value:
528 return i
529 raise ValueError
530
531 def count(self, value):
532 return sum(1 for v in self if v == value)
533
534Sequence.register(tuple)
535Sequence.register(basestring)
536Sequence.register(buffer)
Raymond Hettinger8c56f882009-02-24 12:23:23 +0000537Sequence.register(xrange)
Guido van Rossum64c06e32007-11-22 00:55:51 +0000538
539
540class MutableSequence(Sequence):
541
542 @abstractmethod
543 def __setitem__(self, index, value):
544 raise IndexError
545
546 @abstractmethod
547 def __delitem__(self, index):
548 raise IndexError
549
550 @abstractmethod
551 def insert(self, index, value):
552 raise IndexError
553
554 def append(self, value):
555 self.insert(len(self), value)
556
557 def reverse(self):
558 n = len(self)
559 for i in range(n//2):
560 self[i], self[n-i-1] = self[n-i-1], self[i]
561
562 def extend(self, values):
563 for v in values:
564 self.append(v)
565
566 def pop(self, index=-1):
567 v = self[index]
568 del self[index]
569 return v
570
571 def remove(self, value):
572 del self[self.index(value)]
573
574 def __iadd__(self, values):
575 self.extend(values)
Raymond Hettingerfceb5d42009-05-18 15:51:59 +0000576 return self
Guido van Rossum64c06e32007-11-22 00:55:51 +0000577
578MutableSequence.register(list)