blob: 8bac957808617babff694f72fb2e9f8adbe9210f [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
Raymond Hettinger02184282012-04-05 13:31:12 -070021# Private list of types that we want to register with the various ABCs
22# so that they will pass tests like:
23# it = iter(somebytearray)
24# assert isinstance(it, Iterable)
25# Note: in other implementations, these types many not be distinct
26# and they make have their own implementation specific types that
27# are not included on this list.
Christian Heimesf83be4e2007-11-28 09:44:38 +000028bytes_iterator = type(iter(b''))
29bytearray_iterator = type(iter(bytearray()))
30#callable_iterator = ???
31dict_keyiterator = type(iter({}.keys()))
32dict_valueiterator = type(iter({}.values()))
33dict_itemiterator = type(iter({}.items()))
34list_iterator = type(iter([]))
35list_reverseiterator = type(iter(reversed([])))
36range_iterator = type(iter(range(0)))
37set_iterator = type(iter(set()))
38str_iterator = type(iter(""))
39tuple_iterator = type(iter(()))
40zip_iterator = type(iter(zip()))
41## views ##
42dict_keys = type({}.keys())
43dict_values = type({}.values())
44dict_items = type({}.items())
Christian Heimes0db38532007-11-29 16:21:13 +000045## misc ##
Victor Stinner7b17a4e2012-04-20 01:41:36 +020046mappingproxy = type(type.__dict__)
Christian Heimesf83be4e2007-11-28 09:44:38 +000047
48
Guido van Rossumcd16bf62007-06-13 18:07:49 +000049### ONE-TRICK PONIES ###
50
51class Hashable(metaclass=ABCMeta):
52
Raymond Hettingerc46759a2011-03-22 11:46:25 -070053 __slots__ = ()
54
Guido van Rossumcd16bf62007-06-13 18:07:49 +000055 @abstractmethod
56 def __hash__(self):
57 return 0
58
59 @classmethod
60 def __subclasshook__(cls, C):
61 if cls is Hashable:
62 for B in C.__mro__:
63 if "__hash__" in B.__dict__:
64 if B.__dict__["__hash__"]:
65 return True
66 break
67 return NotImplemented
68
69
70class Iterable(metaclass=ABCMeta):
71
Raymond Hettingerc46759a2011-03-22 11:46:25 -070072 __slots__ = ()
73
Guido van Rossumcd16bf62007-06-13 18:07:49 +000074 @abstractmethod
75 def __iter__(self):
76 while False:
77 yield None
78
79 @classmethod
80 def __subclasshook__(cls, C):
81 if cls is Iterable:
82 if any("__iter__" in B.__dict__ for B in C.__mro__):
83 return True
84 return NotImplemented
85
Guido van Rossumcd16bf62007-06-13 18:07:49 +000086
Raymond Hettinger74b64952008-02-09 02:53:48 +000087class Iterator(Iterable):
Guido van Rossumcd16bf62007-06-13 18:07:49 +000088
Raymond Hettingerc46759a2011-03-22 11:46:25 -070089 __slots__ = ()
90
Guido van Rossumcd16bf62007-06-13 18:07:49 +000091 @abstractmethod
92 def __next__(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -070093 'Return the next item from the iterator. When exhausted, raise StopIteration'
Guido van Rossumcd16bf62007-06-13 18:07:49 +000094 raise StopIteration
95
96 def __iter__(self):
97 return self
98
99 @classmethod
100 def __subclasshook__(cls, C):
101 if cls is Iterator:
Raymond Hettingeread22222010-11-29 03:56:12 +0000102 if (any("__next__" in B.__dict__ for B in C.__mro__) and
103 any("__iter__" in B.__dict__ for B in C.__mro__)):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000104 return True
105 return NotImplemented
106
Christian Heimesf83be4e2007-11-28 09:44:38 +0000107Iterator.register(bytes_iterator)
108Iterator.register(bytearray_iterator)
109#Iterator.register(callable_iterator)
110Iterator.register(dict_keyiterator)
111Iterator.register(dict_valueiterator)
112Iterator.register(dict_itemiterator)
113Iterator.register(list_iterator)
114Iterator.register(list_reverseiterator)
115Iterator.register(range_iterator)
116Iterator.register(set_iterator)
117Iterator.register(str_iterator)
118Iterator.register(tuple_iterator)
119Iterator.register(zip_iterator)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000120
121class Sized(metaclass=ABCMeta):
122
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700123 __slots__ = ()
124
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000125 @abstractmethod
126 def __len__(self):
127 return 0
128
129 @classmethod
130 def __subclasshook__(cls, C):
131 if cls is Sized:
132 if any("__len__" in B.__dict__ for B in C.__mro__):
133 return True
134 return NotImplemented
135
136
137class Container(metaclass=ABCMeta):
138
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700139 __slots__ = ()
140
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000141 @abstractmethod
142 def __contains__(self, x):
143 return False
144
145 @classmethod
146 def __subclasshook__(cls, C):
147 if cls is Container:
148 if any("__contains__" in B.__dict__ for B in C.__mro__):
149 return True
150 return NotImplemented
151
152
153class Callable(metaclass=ABCMeta):
154
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700155 __slots__ = ()
156
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000157 @abstractmethod
Christian Heimes78644762008-03-04 23:39:23 +0000158 def __call__(self, *args, **kwds):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000159 return False
160
161 @classmethod
162 def __subclasshook__(cls, C):
163 if cls is Callable:
164 if any("__call__" in B.__dict__ for B in C.__mro__):
165 return True
166 return NotImplemented
167
168
169### SETS ###
170
171
Raymond Hettinger74b64952008-02-09 02:53:48 +0000172class Set(Sized, Iterable, Container):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000173
174 """A set is a finite, iterable container.
175
176 This class provides concrete generic implementations of all
177 methods except for __contains__, __iter__ and __len__.
178
179 To override the comparisons (presumably for speed, as the
180 semantics are fixed), all you have to do is redefine __le__ and
181 then the other operations will automatically follow suit.
182 """
183
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700184 __slots__ = ()
185
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000186 def __le__(self, other):
187 if not isinstance(other, Set):
188 return NotImplemented
189 if len(self) > len(other):
190 return False
191 for elem in self:
192 if elem not in other:
193 return False
194 return True
195
196 def __lt__(self, other):
197 if not isinstance(other, Set):
198 return NotImplemented
199 return len(self) < len(other) and self.__le__(other)
200
Raymond Hettinger71909422008-02-09 00:08:16 +0000201 def __gt__(self, other):
202 if not isinstance(other, Set):
203 return NotImplemented
Andrew Svetlovbcac6ad2012-11-01 13:28:54 +0200204 return other.__lt__(self)
Raymond Hettinger71909422008-02-09 00:08:16 +0000205
206 def __ge__(self, other):
207 if not isinstance(other, Set):
208 return NotImplemented
Andrew Svetlovbcac6ad2012-11-01 13:28:54 +0200209 return other.__le__(self)
Raymond Hettinger71909422008-02-09 00:08:16 +0000210
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000211 def __eq__(self, other):
212 if not isinstance(other, Set):
213 return NotImplemented
214 return len(self) == len(other) and self.__le__(other)
215
Raymond Hettinger71909422008-02-09 00:08:16 +0000216 def __ne__(self, other):
217 return not (self == other)
218
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000219 @classmethod
220 def _from_iterable(cls, it):
Raymond Hettinger8284c4a2008-02-06 20:47:09 +0000221 '''Construct an instance of the class from any iterable input.
222
223 Must override this method if the class constructor signature
Raymond Hettinger7aebb642008-02-09 03:25:08 +0000224 does not accept an iterable for an input.
Raymond Hettinger8284c4a2008-02-06 20:47:09 +0000225 '''
Raymond Hettinger7aebb642008-02-09 03:25:08 +0000226 return cls(it)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000227
228 def __and__(self, other):
229 if not isinstance(other, Iterable):
230 return NotImplemented
231 return self._from_iterable(value for value in other if value in self)
232
Christian Heimes190d79e2008-01-30 11:58:22 +0000233 def isdisjoint(self, other):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700234 'Return True if two sets have a null intersection.'
Christian Heimes190d79e2008-01-30 11:58:22 +0000235 for value in other:
236 if value in self:
237 return False
238 return True
239
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000240 def __or__(self, other):
241 if not isinstance(other, Iterable):
242 return NotImplemented
Christian Heimes78644762008-03-04 23:39:23 +0000243 chain = (e for s in (self, other) for e in s)
244 return self._from_iterable(chain)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000245
246 def __sub__(self, other):
247 if not isinstance(other, Set):
248 if not isinstance(other, Iterable):
249 return NotImplemented
250 other = self._from_iterable(other)
251 return self._from_iterable(value for value in self
252 if value not in other)
253
254 def __xor__(self, other):
255 if not isinstance(other, Set):
256 if not isinstance(other, Iterable):
257 return NotImplemented
258 other = self._from_iterable(other)
259 return (self - other) | (other - self)
260
261 def _hash(self):
262 """Compute the hash value of a set.
263
264 Note that we don't define __hash__: not all sets are hashable.
265 But if you define a hashable set type, its __hash__ should
266 call this function.
267
268 This must be compatible __eq__.
269
270 All sets ought to compare equal if they contain the same
271 elements, regardless of how they are implemented, and
272 regardless of the order of the elements; so there's not much
273 freedom for __eq__ or __hash__. We match the algorithm used
274 by the built-in frozenset type.
275 """
Christian Heimesa37d4c62007-12-04 23:02:19 +0000276 MAX = sys.maxsize
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000277 MASK = 2 * MAX + 1
278 n = len(self)
279 h = 1927868237 * (n + 1)
280 h &= MASK
281 for x in self:
282 hx = hash(x)
283 h ^= (hx ^ (hx << 16) ^ 89869747) * 3644798167
284 h &= MASK
285 h = h * 69069 + 907133923
286 h &= MASK
287 if h > MAX:
288 h -= MASK + 1
289 if h == -1:
290 h = 590923713
291 return h
292
293Set.register(frozenset)
294
295
296class MutableSet(Set):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700297 """A mutable set is a finite, iterable container.
298
299 This class provides concrete generic implementations of all
300 methods except for __contains__, __iter__, __len__,
301 add(), and discard().
302
303 To override the comparisons (presumably for speed, as the
304 semantics are fixed), all you have to do is redefine __le__ and
305 then the other operations will automatically follow suit.
306 """
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000307
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700308 __slots__ = ()
309
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000310 @abstractmethod
311 def add(self, value):
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000312 """Add an element."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000313 raise NotImplementedError
314
315 @abstractmethod
316 def discard(self, value):
Benjamin Peterson058e31e2009-01-16 03:54:08 +0000317 """Remove an element. Do not raise an exception if absent."""
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000318 raise NotImplementedError
319
Christian Heimes190d79e2008-01-30 11:58:22 +0000320 def remove(self, value):
321 """Remove an element. If not a member, raise a KeyError."""
322 if value not in self:
323 raise KeyError(value)
324 self.discard(value)
325
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000326 def pop(self):
327 """Return the popped value. Raise KeyError if empty."""
328 it = iter(self)
329 try:
Raymond Hettingerae650182009-01-28 23:33:59 +0000330 value = next(it)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000331 except StopIteration:
332 raise KeyError
333 self.discard(value)
334 return value
335
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000336 def clear(self):
337 """This is slow (creates N new iterators!) but effective."""
338 try:
339 while True:
340 self.pop()
341 except KeyError:
342 pass
343
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000344 def __ior__(self, it):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000345 for value in it:
346 self.add(value)
347 return self
348
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000349 def __iand__(self, it):
Raymond Hettinger3f10a952009-04-01 19:05:50 +0000350 for value in (self - it):
351 self.discard(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000352 return self
353
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000354 def __ixor__(self, it):
Daniel Stutzbach31da5b22010-08-24 20:49:57 +0000355 if it is self:
356 self.clear()
357 else:
358 if not isinstance(it, Set):
359 it = self._from_iterable(it)
360 for value in it:
361 if value in self:
362 self.discard(value)
363 else:
364 self.add(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000365 return self
366
Raymond Hettingerb3d89a42011-01-12 20:37:47 +0000367 def __isub__(self, it):
Daniel Stutzbach31da5b22010-08-24 20:49:57 +0000368 if it is self:
369 self.clear()
370 else:
371 for value in it:
372 self.discard(value)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000373 return self
374
375MutableSet.register(set)
376
377
378### MAPPINGS ###
379
380
Raymond Hettinger74b64952008-02-09 02:53:48 +0000381class Mapping(Sized, Iterable, Container):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000382
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700383 __slots__ = ()
384
Raymond Hettinger153866e2013-03-24 15:20:29 -0700385 """A Mapping is a generic container for associating key/value
386 pairs.
387
388 This class provides concrete generic implementations of all
389 methods except for __getitem__, __iter__, and __len__.
390
391 """
392
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000393 @abstractmethod
394 def __getitem__(self, key):
395 raise KeyError
396
397 def get(self, key, default=None):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700398 'D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000399 try:
400 return self[key]
401 except KeyError:
402 return default
403
404 def __contains__(self, key):
405 try:
406 self[key]
407 except KeyError:
408 return False
409 else:
410 return True
411
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000412 def keys(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700413 "D.keys() -> a set-like object providing a view on D's keys"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000414 return KeysView(self)
415
416 def items(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700417 "D.items() -> a set-like object providing a view on D's items"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000418 return ItemsView(self)
419
420 def values(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700421 "D.values() -> an object providing a view on D's values"
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000422 return ValuesView(self)
423
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000424 def __eq__(self, other):
Benjamin Peterson4ad6bd52010-05-21 20:55:22 +0000425 if not isinstance(other, Mapping):
426 return NotImplemented
427 return dict(self.items()) == dict(other.items())
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000428
429 def __ne__(self, other):
Raymond Hettinger554c8b82008-02-05 22:54:43 +0000430 return not (self == other)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000431
Victor Stinner7b17a4e2012-04-20 01:41:36 +0200432Mapping.register(mappingproxy)
433
Christian Heimes2202f872008-02-06 14:31:34 +0000434
Raymond Hettingerbfd06122008-02-09 10:04:32 +0000435class MappingView(Sized):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000436
437 def __init__(self, mapping):
438 self._mapping = mapping
439
440 def __len__(self):
441 return len(self._mapping)
442
Raymond Hettinger89fc2b72009-02-27 07:47:32 +0000443 def __repr__(self):
444 return '{0.__class__.__name__}({0._mapping!r})'.format(self)
445
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000446
447class KeysView(MappingView, Set):
448
Raymond Hettinger9117c752010-08-22 07:44:24 +0000449 @classmethod
450 def _from_iterable(self, it):
451 return set(it)
452
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000453 def __contains__(self, key):
454 return key in self._mapping
455
456 def __iter__(self):
Philip Jenvey4993cc02012-10-01 12:53:43 -0700457 yield from self._mapping
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000458
Christian Heimesf83be4e2007-11-28 09:44:38 +0000459KeysView.register(dict_keys)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000460
461
462class ItemsView(MappingView, Set):
463
Raymond Hettinger9117c752010-08-22 07:44:24 +0000464 @classmethod
465 def _from_iterable(self, it):
466 return set(it)
467
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000468 def __contains__(self, item):
469 key, value = item
470 try:
471 v = self._mapping[key]
472 except KeyError:
473 return False
474 else:
475 return v == value
476
477 def __iter__(self):
478 for key in self._mapping:
479 yield (key, self._mapping[key])
480
Christian Heimesf83be4e2007-11-28 09:44:38 +0000481ItemsView.register(dict_items)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000482
483
484class ValuesView(MappingView):
485
486 def __contains__(self, value):
487 for key in self._mapping:
488 if value == self._mapping[key]:
489 return True
490 return False
491
492 def __iter__(self):
493 for key in self._mapping:
494 yield self._mapping[key]
495
Christian Heimesf83be4e2007-11-28 09:44:38 +0000496ValuesView.register(dict_values)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000497
498
499class MutableMapping(Mapping):
500
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700501 __slots__ = ()
502
Raymond Hettinger153866e2013-03-24 15:20:29 -0700503 """A MutableMapping is a generic container for associating
504 key/value pairs.
505
506 This class provides concrete generic implementations of all
507 methods except for __getitem__, __setitem__, __delitem__,
508 __iter__, and __len__.
509
510 """
511
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000512 @abstractmethod
513 def __setitem__(self, key, value):
514 raise KeyError
515
516 @abstractmethod
517 def __delitem__(self, key):
518 raise KeyError
519
520 __marker = object()
521
522 def pop(self, key, default=__marker):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700523 '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
524 If key is not found, d is returned if given, otherwise KeyError is raised.
525 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000526 try:
527 value = self[key]
528 except KeyError:
529 if default is self.__marker:
530 raise
531 return default
532 else:
533 del self[key]
534 return value
535
536 def popitem(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700537 '''D.popitem() -> (k, v), remove and return some (key, value) pair
538 as a 2-tuple; but raise KeyError if D is empty.
539 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000540 try:
541 key = next(iter(self))
542 except StopIteration:
543 raise KeyError
544 value = self[key]
545 del self[key]
546 return key, value
547
548 def clear(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700549 'D.clear() -> None. Remove all items from D.'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000550 try:
551 while True:
552 self.popitem()
553 except KeyError:
554 pass
555
Mark Dickinsonb214e902010-07-11 18:53:06 +0000556 def update(*args, **kwds):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700557 ''' D.update([E, ]**F) -> None. Update D from mapping/iterable E and F.
558 If E present and has a .keys() method, does: for k in E: D[k] = E[k]
559 If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v
560 In either case, this is followed by: for k, v in F.items(): D[k] = v
561 '''
Mark Dickinsonb214e902010-07-11 18:53:06 +0000562 if len(args) > 2:
563 raise TypeError("update() takes at most 2 positional "
564 "arguments ({} given)".format(len(args)))
565 elif not args:
566 raise TypeError("update() takes at least 1 argument (0 given)")
567 self = args[0]
568 other = args[1] if len(args) >= 2 else ()
569
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000570 if isinstance(other, Mapping):
571 for key in other:
572 self[key] = other[key]
573 elif hasattr(other, "keys"):
574 for key in other.keys():
575 self[key] = other[key]
576 else:
577 for key, value in other:
578 self[key] = value
579 for key, value in kwds.items():
580 self[key] = value
581
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000582 def setdefault(self, key, default=None):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700583 'D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D'
Raymond Hettingerb9da9bc2008-02-04 20:44:31 +0000584 try:
585 return self[key]
586 except KeyError:
587 self[key] = default
588 return default
589
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000590MutableMapping.register(dict)
591
592
593### SEQUENCES ###
594
595
Raymond Hettinger74b64952008-02-09 02:53:48 +0000596class Sequence(Sized, Iterable, Container):
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000597
598 """All the operations on a read-only sequence.
599
600 Concrete subclasses must override __new__ or __init__,
601 __getitem__, and __len__.
602 """
603
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700604 __slots__ = ()
605
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000606 @abstractmethod
607 def __getitem__(self, index):
608 raise IndexError
609
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000610 def __iter__(self):
611 i = 0
Raymond Hettinger71909422008-02-09 00:08:16 +0000612 try:
613 while True:
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000614 v = self[i]
Raymond Hettinger71909422008-02-09 00:08:16 +0000615 yield v
616 i += 1
617 except IndexError:
618 return
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000619
620 def __contains__(self, value):
621 for v in self:
622 if v == value:
623 return True
624 return False
625
626 def __reversed__(self):
627 for i in reversed(range(len(self))):
628 yield self[i]
629
630 def index(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700631 '''S.index(value) -> integer -- return first index of value.
632 Raises ValueError if the value is not present.
633 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000634 for i, v in enumerate(self):
635 if v == value:
636 return i
637 raise ValueError
638
639 def count(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700640 'S.count(value) -> integer -- return number of occurrences of value'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000641 return sum(1 for v in self if v == value)
642
643Sequence.register(tuple)
Guido van Rossum3172c5d2007-10-16 18:12:55 +0000644Sequence.register(str)
Raymond Hettinger9aa53c22009-02-24 11:25:35 +0000645Sequence.register(range)
Guido van Rossumd05eb002007-11-21 22:26:24 +0000646
647
648class ByteString(Sequence):
649
650 """This unifies bytes and bytearray.
651
652 XXX Should add all their methods.
653 """
654
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700655 __slots__ = ()
656
Guido van Rossumd05eb002007-11-21 22:26:24 +0000657ByteString.register(bytes)
658ByteString.register(bytearray)
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000659
660
661class MutableSequence(Sequence):
662
Raymond Hettingerc46759a2011-03-22 11:46:25 -0700663 __slots__ = ()
664
Raymond Hettinger153866e2013-03-24 15:20:29 -0700665 """All the operations on a read-only sequence.
666
667 Concrete subclasses must provide __new__ or __init__,
668 __getitem__, __setitem__, __delitem__, __len__, and insert().
669
670 """
671
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000672 @abstractmethod
673 def __setitem__(self, index, value):
674 raise IndexError
675
676 @abstractmethod
677 def __delitem__(self, index):
678 raise IndexError
679
680 @abstractmethod
681 def insert(self, index, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700682 'S.insert(index, value) -- insert value before index'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000683 raise IndexError
684
685 def append(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700686 'S.append(value) -- append value to the end of the sequence'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000687 self.insert(len(self), value)
688
Eli Bendersky9479d1a2011-03-04 05:34:58 +0000689 def clear(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700690 'S.clear() -> None -- remove all items from S'
Eli Bendersky9479d1a2011-03-04 05:34:58 +0000691 try:
692 while True:
693 self.pop()
694 except IndexError:
695 pass
696
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000697 def reverse(self):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700698 'S.reverse() -- reverse *IN PLACE*'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000699 n = len(self)
700 for i in range(n//2):
701 self[i], self[n-i-1] = self[n-i-1], self[i]
702
703 def extend(self, values):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700704 'S.extend(iterable) -- extend sequence by appending elements from the iterable'
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000705 for v in values:
706 self.append(v)
707
708 def pop(self, index=-1):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700709 '''S.pop([index]) -> item -- remove and return item at index (default last).
710 Raise IndexError if list is empty or index is out of range.
711 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000712 v = self[index]
713 del self[index]
714 return v
715
716 def remove(self, value):
Raymond Hettinger153866e2013-03-24 15:20:29 -0700717 '''S.remove(value) -- remove first occurrence of value.
718 Raise ValueError if the value is not present.
719 '''
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000720 del self[self.index(value)]
721
722 def __iadd__(self, values):
723 self.extend(values)
Raymond Hettingerc384b222009-05-18 15:35:26 +0000724 return self
Guido van Rossumcd16bf62007-06-13 18:07:49 +0000725
726MutableSequence.register(list)
Guido van Rossumd05eb002007-11-21 22:26:24 +0000727MutableSequence.register(bytearray) # Multiply inheriting, see ByteString