blob: 0438afda2851567d98e0487991d9729bc5fd8f7e [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):
Raymond Hettingercce5b042013-03-24 14:54:25 -070077 'Return the next item from the iterator. When exhausted, raise StopIteration'
Guido van Rossum64c06e32007-11-22 00:55:51 +000078 raise StopIteration
79
80 def __iter__(self):
81 return self
82
83 @classmethod
84 def __subclasshook__(cls, C):
85 if cls is Iterator:
Alexander Belopolsky1fea5c42010-11-30 01:18:17 +000086 if _hasattr(C, "next") and _hasattr(C, "__iter__"):
Guido van Rossum64c06e32007-11-22 00:55:51 +000087 return True
88 return NotImplemented
89
90
91class Sized:
92 __metaclass__ = ABCMeta
93
94 @abstractmethod
95 def __len__(self):
96 return 0
97
98 @classmethod
99 def __subclasshook__(cls, C):
100 if cls is Sized:
Florent Xicluna47627d52010-03-08 15:20:28 +0000101 if _hasattr(C, "__len__"):
Guido van Rossum64c06e32007-11-22 00:55:51 +0000102 return True
103 return NotImplemented
104
105
106class Container:
107 __metaclass__ = ABCMeta
108
109 @abstractmethod
110 def __contains__(self, x):
111 return False
112
113 @classmethod
114 def __subclasshook__(cls, C):
115 if cls is Container:
Florent Xicluna47627d52010-03-08 15:20:28 +0000116 if _hasattr(C, "__contains__"):
Guido van Rossum64c06e32007-11-22 00:55:51 +0000117 return True
118 return NotImplemented
119
120
121class Callable:
122 __metaclass__ = ABCMeta
123
124 @abstractmethod
Raymond Hettinger10ac19b2008-03-03 22:19:58 +0000125 def __call__(self, *args, **kwds):
Guido van Rossum64c06e32007-11-22 00:55:51 +0000126 return False
127
128 @classmethod
129 def __subclasshook__(cls, C):
130 if cls is Callable:
Florent Xicluna47627d52010-03-08 15:20:28 +0000131 if _hasattr(C, "__call__"):
Guido van Rossum64c06e32007-11-22 00:55:51 +0000132 return True
133 return NotImplemented
134
135
136### SETS ###
137
138
Raymond Hettingerc2bc0d12008-02-09 01:18:42 +0000139class Set(Sized, Iterable, Container):
Guido van Rossum64c06e32007-11-22 00:55:51 +0000140 """A set is a finite, iterable container.
141
142 This class provides concrete generic implementations of all
143 methods except for __contains__, __iter__ and __len__.
144
145 To override the comparisons (presumably for speed, as the
146 semantics are fixed), all you have to do is redefine __le__ and
147 then the other operations will automatically follow suit.
148 """
149
Guido van Rossum64c06e32007-11-22 00:55:51 +0000150 def __le__(self, other):
151 if not isinstance(other, Set):
152 return NotImplemented
153 if len(self) > len(other):
154 return False
155 for elem in self:
156 if elem not in other:
157 return False
158 return True
159
160 def __lt__(self, other):
161 if not isinstance(other, Set):
162 return NotImplemented
163 return len(self) < len(other) and self.__le__(other)
164
Raymond Hettingerd53f1c42008-02-08 23:34:21 +0000165 def __gt__(self, other):
166 if not isinstance(other, Set):
167 return NotImplemented
168 return other < self
169
170 def __ge__(self, other):
171 if not isinstance(other, Set):
172 return NotImplemented
173 return other <= self
174
Guido van Rossum64c06e32007-11-22 00:55:51 +0000175 def __eq__(self, other):
176 if not isinstance(other, Set):
177 return NotImplemented
178 return len(self) == len(other) and self.__le__(other)
179
Raymond Hettingerd53f1c42008-02-08 23:34:21 +0000180 def __ne__(self, other):
181 return not (self == other)
182
Guido van Rossum64c06e32007-11-22 00:55:51 +0000183 @classmethod
184 def _from_iterable(cls, it):
Raymond Hettinger017b6a32008-02-07 03:10:33 +0000185 '''Construct an instance of the class from any iterable input.
186
187 Must override this method if the class constructor signature
Raymond Hettinger2e827bf2008-02-09 03:34:52 +0000188 does not accept an iterable for an input.
Raymond Hettinger017b6a32008-02-07 03:10:33 +0000189 '''
Raymond Hettinger2e827bf2008-02-09 03:34:52 +0000190 return cls(it)
Guido van Rossum64c06e32007-11-22 00:55:51 +0000191
192 def __and__(self, other):
193 if not isinstance(other, Iterable):
194 return NotImplemented
195 return self._from_iterable(value for value in other if value in self)
196
Raymond Hettingerabf3fcf2008-01-30 00:01:07 +0000197 def isdisjoint(self, other):
Raymond Hettingercce5b042013-03-24 14:54:25 -0700198 'Return True if two sets have a null intersection.'
Raymond Hettingerabf3fcf2008-01-30 00:01:07 +0000199 for value in other:
200 if value in self:
201 return False
202 return True
203
Guido van Rossum64c06e32007-11-22 00:55:51 +0000204 def __or__(self, other):
205 if not isinstance(other, Iterable):
206 return NotImplemented
Raymond Hettinger972fb072008-03-03 22:04:55 +0000207 chain = (e for s in (self, other) for e in s)
208 return self._from_iterable(chain)
Guido van Rossum64c06e32007-11-22 00:55:51 +0000209
210 def __sub__(self, other):
211 if not isinstance(other, Set):
212 if not isinstance(other, Iterable):
213 return NotImplemented
214 other = self._from_iterable(other)
215 return self._from_iterable(value for value in self
216 if value not in other)
217
218 def __xor__(self, other):
219 if not isinstance(other, Set):
220 if not isinstance(other, Iterable):
221 return NotImplemented
222 other = self._from_iterable(other)
223 return (self - other) | (other - self)
224
Nick Coghlan48361f52008-08-11 15:45:58 +0000225 # Sets are not hashable by default, but subclasses can change this
226 __hash__ = None
227
Guido van Rossum64c06e32007-11-22 00:55:51 +0000228 def _hash(self):
229 """Compute the hash value of a set.
230
231 Note that we don't define __hash__: not all sets are hashable.
232 But if you define a hashable set type, its __hash__ should
233 call this function.
234
235 This must be compatible __eq__.
236
237 All sets ought to compare equal if they contain the same
238 elements, regardless of how they are implemented, and
239 regardless of the order of the elements; so there's not much
240 freedom for __eq__ or __hash__. We match the algorithm used
241 by the built-in frozenset type.
242 """
243 MAX = sys.maxint
244 MASK = 2 * MAX + 1
245 n = len(self)
246 h = 1927868237 * (n + 1)
247 h &= MASK
248 for x in self:
249 hx = hash(x)
250 h ^= (hx ^ (hx << 16) ^ 89869747) * 3644798167
251 h &= MASK
252 h = h * 69069 + 907133923
253 h &= MASK
254 if h > MAX:
255 h -= MASK + 1
256 if h == -1:
257 h = 590923713
258 return h
259
260Set.register(frozenset)
261
262
263class MutableSet(Set):
Raymond Hettingercce5b042013-03-24 14:54:25 -0700264 """A mutable set is a finite, iterable container.
265
266 This class provides concrete generic implementations of all
267 methods except for __contains__, __iter__, __len__,
268 add(), and discard().
269
270 To override the comparisons (presumably for speed, as the
271 semantics are fixed), all you have to do is redefine __le__ and
272 then the other operations will automatically follow suit.
273 """
Guido van Rossum64c06e32007-11-22 00:55:51 +0000274
275 @abstractmethod
276 def add(self, value):
Raymond Hettinger2d21d502009-01-13 09:08:32 +0000277 """Add an element."""
Guido van Rossum64c06e32007-11-22 00:55:51 +0000278 raise NotImplementedError
279
280 @abstractmethod
281 def discard(self, value):
Raymond Hettinger2d21d502009-01-13 09:08:32 +0000282 """Remove an element. Do not raise an exception if absent."""
Guido van Rossum64c06e32007-11-22 00:55:51 +0000283 raise NotImplementedError
284
Raymond Hettinger7d518f42008-01-30 00:08:31 +0000285 def remove(self, value):
286 """Remove an element. If not a member, raise a KeyError."""
287 if value not in self:
288 raise KeyError(value)
289 self.discard(value)
290
Guido van Rossum64c06e32007-11-22 00:55:51 +0000291 def pop(self):
292 """Return the popped value. Raise KeyError if empty."""
293 it = iter(self)
294 try:
Raymond Hettingerf779e6f2009-01-28 23:02:26 +0000295 value = next(it)
Guido van Rossum64c06e32007-11-22 00:55:51 +0000296 except StopIteration:
297 raise KeyError
298 self.discard(value)
299 return value
300
Guido van Rossum64c06e32007-11-22 00:55:51 +0000301 def clear(self):
302 """This is slow (creates N new iterators!) but effective."""
303 try:
304 while True:
305 self.pop()
306 except KeyError:
307 pass
308
309 def __ior__(self, it):
310 for value in it:
311 self.add(value)
312 return self
313
Raymond Hettinger66c4a6b2009-04-01 18:50:56 +0000314 def __iand__(self, it):
315 for value in (self - it):
316 self.discard(value)
Guido van Rossum64c06e32007-11-22 00:55:51 +0000317 return self
318
319 def __ixor__(self, it):
Daniel Stutzbach91287322010-08-24 21:09:30 +0000320 if it is self:
321 self.clear()
322 else:
323 if not isinstance(it, Set):
324 it = self._from_iterable(it)
325 for value in it:
326 if value in self:
327 self.discard(value)
328 else:
329 self.add(value)
Raymond Hettingere973c612008-01-31 01:42:11 +0000330 return self
Guido van Rossum64c06e32007-11-22 00:55:51 +0000331
332 def __isub__(self, it):
Daniel Stutzbach91287322010-08-24 21:09:30 +0000333 if it is self:
334 self.clear()
335 else:
336 for value in it:
337 self.discard(value)
Guido van Rossum64c06e32007-11-22 00:55:51 +0000338 return self
339
340MutableSet.register(set)
341
342
343### MAPPINGS ###
344
345
Raymond Hettingerc2bc0d12008-02-09 01:18:42 +0000346class Mapping(Sized, Iterable, Container):
Guido van Rossum64c06e32007-11-22 00:55:51 +0000347
Raymond Hettingercce5b042013-03-24 14:54:25 -0700348 """A Mapping is a generic container for associating key/value
349 pairs.
350
351 This class provides concrete generic implementations of all
352 methods except for __getitem__, __iter__, and __len__.
353
354 """
355
Guido van Rossum64c06e32007-11-22 00:55:51 +0000356 @abstractmethod
357 def __getitem__(self, key):
358 raise KeyError
359
360 def get(self, key, default=None):
Raymond Hettingercce5b042013-03-24 14:54:25 -0700361 'D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.'
Guido van Rossum64c06e32007-11-22 00:55:51 +0000362 try:
363 return self[key]
364 except KeyError:
365 return default
366
367 def __contains__(self, key):
368 try:
369 self[key]
370 except KeyError:
371 return False
372 else:
373 return True
374
Georg Brandl60fbf7f2008-06-07 17:03:28 +0000375 def iterkeys(self):
Raymond Hettingercce5b042013-03-24 14:54:25 -0700376 'D.iterkeys() -> an iterator over the keys of D'
Georg Brandl60fbf7f2008-06-07 17:03:28 +0000377 return iter(self)
378
379 def itervalues(self):
Raymond Hettingercce5b042013-03-24 14:54:25 -0700380 'D.itervalues() -> an iterator over the values of D'
Georg Brandl60fbf7f2008-06-07 17:03:28 +0000381 for key in self:
382 yield self[key]
383
384 def iteritems(self):
Raymond Hettingercce5b042013-03-24 14:54:25 -0700385 'D.iteritems() -> an iterator over the (key, value) items of D'
Georg Brandl60fbf7f2008-06-07 17:03:28 +0000386 for key in self:
387 yield (key, self[key])
388
Guido van Rossum64c06e32007-11-22 00:55:51 +0000389 def keys(self):
Raymond Hettingercce5b042013-03-24 14:54:25 -0700390 "D.keys() -> list of D's keys"
Georg Brandl60fbf7f2008-06-07 17:03:28 +0000391 return list(self)
Guido van Rossum64c06e32007-11-22 00:55:51 +0000392
393 def items(self):
Raymond Hettingercce5b042013-03-24 14:54:25 -0700394 "D.items() -> list of D's (key, value) pairs, as 2-tuples"
Georg Brandl60fbf7f2008-06-07 17:03:28 +0000395 return [(key, self[key]) for key in self]
Guido van Rossum64c06e32007-11-22 00:55:51 +0000396
397 def values(self):
Raymond Hettingercce5b042013-03-24 14:54:25 -0700398 "D.values() -> list of D's values"
Georg Brandl60fbf7f2008-06-07 17:03:28 +0000399 return [self[key] for key in self]
Guido van Rossum64c06e32007-11-22 00:55:51 +0000400
Nick Coghlan48361f52008-08-11 15:45:58 +0000401 # Mappings are not hashable by default, but subclasses can change this
402 __hash__ = None
403
Raymond Hettinger45eda642008-02-06 01:49:00 +0000404 def __eq__(self, other):
Benjamin Petersoneb318d32010-05-21 20:51:45 +0000405 if not isinstance(other, Mapping):
406 return NotImplemented
407 return dict(self.items()) == dict(other.items())
Raymond Hettinger45eda642008-02-06 01:49:00 +0000408
409 def __ne__(self, other):
410 return not (self == other)
Guido van Rossum64c06e32007-11-22 00:55:51 +0000411
Raymond Hettingerc2bc0d12008-02-09 01:18:42 +0000412class MappingView(Sized):
Guido van Rossum64c06e32007-11-22 00:55:51 +0000413
414 def __init__(self, mapping):
415 self._mapping = mapping
416
417 def __len__(self):
418 return len(self._mapping)
419
Raymond Hettingerb31a6d02009-02-27 08:09:47 +0000420 def __repr__(self):
421 return '{0.__class__.__name__}({0._mapping!r})'.format(self)
422
Guido van Rossum64c06e32007-11-22 00:55:51 +0000423
424class KeysView(MappingView, Set):
425
Raymond Hettinger917bba12010-08-22 08:01:58 +0000426 @classmethod
427 def _from_iterable(self, it):
428 return set(it)
429
Guido van Rossum64c06e32007-11-22 00:55:51 +0000430 def __contains__(self, key):
431 return key in self._mapping
432
433 def __iter__(self):
434 for key in self._mapping:
435 yield key
436
Guido van Rossum64c06e32007-11-22 00:55:51 +0000437
438class ItemsView(MappingView, Set):
439
Raymond Hettinger917bba12010-08-22 08:01:58 +0000440 @classmethod
441 def _from_iterable(self, it):
442 return set(it)
443
Guido van Rossum64c06e32007-11-22 00:55:51 +0000444 def __contains__(self, item):
445 key, value = item
446 try:
447 v = self._mapping[key]
448 except KeyError:
449 return False
450 else:
451 return v == value
452
453 def __iter__(self):
454 for key in self._mapping:
455 yield (key, self._mapping[key])
456
Guido van Rossum64c06e32007-11-22 00:55:51 +0000457
458class ValuesView(MappingView):
459
460 def __contains__(self, value):
461 for key in self._mapping:
462 if value == self._mapping[key]:
463 return True
464 return False
465
466 def __iter__(self):
467 for key in self._mapping:
468 yield self._mapping[key]
469
Guido van Rossum64c06e32007-11-22 00:55:51 +0000470
471class MutableMapping(Mapping):
472
Raymond Hettingercce5b042013-03-24 14:54:25 -0700473 """A MutableMapping is a generic container for associating
474 key/value pairs.
475
476 This class provides concrete generic implementations of all
477 methods except for __getitem__, __setitem__, __delitem__,
478 __iter__, and __len__.
479
480 """
481
Guido van Rossum64c06e32007-11-22 00:55:51 +0000482 @abstractmethod
483 def __setitem__(self, key, value):
484 raise KeyError
485
486 @abstractmethod
487 def __delitem__(self, key):
488 raise KeyError
489
490 __marker = object()
491
492 def pop(self, key, default=__marker):
Raymond Hettingercce5b042013-03-24 14:54:25 -0700493 '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
494 If key is not found, d is returned if given, otherwise KeyError is raised.
495 '''
Guido van Rossum64c06e32007-11-22 00:55:51 +0000496 try:
497 value = self[key]
498 except KeyError:
499 if default is self.__marker:
500 raise
501 return default
502 else:
503 del self[key]
504 return value
505
506 def popitem(self):
Raymond Hettingercce5b042013-03-24 14:54:25 -0700507 '''D.popitem() -> (k, v), remove and return some (key, value) pair
508 as a 2-tuple; but raise KeyError if D is empty.
509 '''
Guido van Rossum64c06e32007-11-22 00:55:51 +0000510 try:
511 key = next(iter(self))
512 except StopIteration:
513 raise KeyError
514 value = self[key]
515 del self[key]
516 return key, value
517
518 def clear(self):
Raymond Hettingercce5b042013-03-24 14:54:25 -0700519 'D.clear() -> None. Remove all items from D.'
Guido van Rossum64c06e32007-11-22 00:55:51 +0000520 try:
521 while True:
522 self.popitem()
523 except KeyError:
524 pass
525
Mark Dickinson42add992010-07-11 19:17:28 +0000526 def update(*args, **kwds):
Raymond Hettingercce5b042013-03-24 14:54:25 -0700527 ''' D.update([E, ]**F) -> None. Update D from mapping/iterable E and F.
528 If E present and has a .keys() method, does: for k in E: D[k] = E[k]
529 If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v
530 In either case, this is followed by: for k, v in F.items(): D[k] = v
531 '''
Mark Dickinson42add992010-07-11 19:17:28 +0000532 if len(args) > 2:
533 raise TypeError("update() takes at most 2 positional "
534 "arguments ({} given)".format(len(args)))
535 elif not args:
536 raise TypeError("update() takes at least 1 argument (0 given)")
537 self = args[0]
538 other = args[1] if len(args) >= 2 else ()
539
Guido van Rossum64c06e32007-11-22 00:55:51 +0000540 if isinstance(other, Mapping):
541 for key in other:
542 self[key] = other[key]
543 elif hasattr(other, "keys"):
544 for key in other.keys():
545 self[key] = other[key]
546 else:
547 for key, value in other:
548 self[key] = value
549 for key, value in kwds.items():
550 self[key] = value
551
Raymond Hettinger45eda642008-02-06 01:49:00 +0000552 def setdefault(self, key, default=None):
Raymond Hettingercce5b042013-03-24 14:54:25 -0700553 'D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D'
Raymond Hettinger45eda642008-02-06 01:49:00 +0000554 try:
555 return self[key]
556 except KeyError:
557 self[key] = default
558 return default
559
Guido van Rossum64c06e32007-11-22 00:55:51 +0000560MutableMapping.register(dict)
561
562
563### SEQUENCES ###
564
565
Raymond Hettingerc2bc0d12008-02-09 01:18:42 +0000566class Sequence(Sized, Iterable, Container):
Guido van Rossum64c06e32007-11-22 00:55:51 +0000567 """All the operations on a read-only sequence.
568
569 Concrete subclasses must override __new__ or __init__,
570 __getitem__, and __len__.
571 """
572
573 @abstractmethod
574 def __getitem__(self, index):
575 raise IndexError
576
Guido van Rossum64c06e32007-11-22 00:55:51 +0000577 def __iter__(self):
578 i = 0
Raymond Hettinger18a1ffc2008-02-08 23:02:27 +0000579 try:
580 while True:
Guido van Rossum64c06e32007-11-22 00:55:51 +0000581 v = self[i]
Raymond Hettinger18a1ffc2008-02-08 23:02:27 +0000582 yield v
583 i += 1
584 except IndexError:
585 return
Guido van Rossum64c06e32007-11-22 00:55:51 +0000586
587 def __contains__(self, value):
588 for v in self:
589 if v == value:
590 return True
591 return False
592
593 def __reversed__(self):
594 for i in reversed(range(len(self))):
595 yield self[i]
596
597 def index(self, value):
Raymond Hettingercce5b042013-03-24 14:54:25 -0700598 '''S.index(value) -> integer -- return first index of value.
599 Raises ValueError if the value is not present.
600 '''
Guido van Rossum64c06e32007-11-22 00:55:51 +0000601 for i, v in enumerate(self):
602 if v == value:
603 return i
604 raise ValueError
605
606 def count(self, value):
Raymond Hettingercce5b042013-03-24 14:54:25 -0700607 'S.count(value) -> integer -- return number of occurrences of value'
Guido van Rossum64c06e32007-11-22 00:55:51 +0000608 return sum(1 for v in self if v == value)
609
610Sequence.register(tuple)
611Sequence.register(basestring)
612Sequence.register(buffer)
Raymond Hettinger8c56f882009-02-24 12:23:23 +0000613Sequence.register(xrange)
Guido van Rossum64c06e32007-11-22 00:55:51 +0000614
615
616class MutableSequence(Sequence):
617
Raymond Hettingercce5b042013-03-24 14:54:25 -0700618 """All the operations on a read-only sequence.
619
620 Concrete subclasses must provide __new__ or __init__,
621 __getitem__, __setitem__, __delitem__, __len__, and insert().
622
623 """
624
Guido van Rossum64c06e32007-11-22 00:55:51 +0000625 @abstractmethod
626 def __setitem__(self, index, value):
627 raise IndexError
628
629 @abstractmethod
630 def __delitem__(self, index):
631 raise IndexError
632
633 @abstractmethod
634 def insert(self, index, value):
Raymond Hettingercce5b042013-03-24 14:54:25 -0700635 'S.insert(index, object) -- insert object before index'
Guido van Rossum64c06e32007-11-22 00:55:51 +0000636 raise IndexError
637
638 def append(self, value):
Raymond Hettingercce5b042013-03-24 14:54:25 -0700639 'S.append(object) -- append object to the end of the sequence'
Guido van Rossum64c06e32007-11-22 00:55:51 +0000640 self.insert(len(self), value)
641
642 def reverse(self):
Raymond Hettingercce5b042013-03-24 14:54:25 -0700643 'S.reverse() -- reverse *IN PLACE*'
Guido van Rossum64c06e32007-11-22 00:55:51 +0000644 n = len(self)
645 for i in range(n//2):
646 self[i], self[n-i-1] = self[n-i-1], self[i]
647
648 def extend(self, values):
Raymond Hettingercce5b042013-03-24 14:54:25 -0700649 'S.extend(iterable) -- extend sequence by appending elements from the iterable'
Guido van Rossum64c06e32007-11-22 00:55:51 +0000650 for v in values:
651 self.append(v)
652
653 def pop(self, index=-1):
Raymond Hettingercce5b042013-03-24 14:54:25 -0700654 '''S.pop([index]) -> item -- remove and return item at index (default last).
655 Raise IndexError if list is empty or index is out of range.
656 '''
Guido van Rossum64c06e32007-11-22 00:55:51 +0000657 v = self[index]
658 del self[index]
659 return v
660
661 def remove(self, value):
Raymond Hettingercce5b042013-03-24 14:54:25 -0700662 '''S.remove(value) -- remove first occurrence of value.
663 Raise ValueError if the value is not present.
664 '''
Guido van Rossum64c06e32007-11-22 00:55:51 +0000665 del self[self.index(value)]
666
667 def __iadd__(self, values):
668 self.extend(values)
Raymond Hettingerfceb5d42009-05-18 15:51:59 +0000669 return self
Guido van Rossum64c06e32007-11-22 00:55:51 +0000670
671MutableSequence.register(list)