_collections_abc.py 24 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939
  1. # Copyright 2007 Google, Inc. All Rights Reserved.
  2. # Licensed to PSF under a Contributor Agreement.
  3. """Abstract Base Classes (ABCs) for collections, according to PEP 3119.
  4. Unit tests are in test_collections.
  5. """
  6. from abc import ABCMeta, abstractmethod
  7. import sys
  8. __all__ = ["Awaitable", "Coroutine", "AsyncIterable", "AsyncIterator",
  9. "Hashable", "Iterable", "Iterator", "Generator",
  10. "Sized", "Container", "Callable",
  11. "Set", "MutableSet",
  12. "Mapping", "MutableMapping",
  13. "MappingView", "KeysView", "ItemsView", "ValuesView",
  14. "Sequence", "MutableSequence",
  15. "ByteString",
  16. ]
  17. # This module has been renamed from collections.abc to _collections_abc to
  18. # speed up interpreter startup. Some of the types such as MutableMapping are
  19. # required early but collections module imports a lot of other modules.
  20. # See issue #19218
  21. __name__ = "collections.abc"
  22. # Private list of types that we want to register with the various ABCs
  23. # so that they will pass tests like:
  24. # it = iter(somebytearray)
  25. # assert isinstance(it, Iterable)
  26. # Note: in other implementations, these types many not be distinct
  27. # and they make have their own implementation specific types that
  28. # are not included on this list.
  29. bytes_iterator = type(iter(b''))
  30. bytearray_iterator = type(iter(bytearray()))
  31. #callable_iterator = ???
  32. dict_keyiterator = type(iter({}.keys()))
  33. dict_valueiterator = type(iter({}.values()))
  34. dict_itemiterator = type(iter({}.items()))
  35. list_iterator = type(iter([]))
  36. list_reverseiterator = type(iter(reversed([])))
  37. range_iterator = type(iter(range(0)))
  38. set_iterator = type(iter(set()))
  39. str_iterator = type(iter(""))
  40. tuple_iterator = type(iter(()))
  41. zip_iterator = type(iter(zip()))
  42. ## views ##
  43. dict_keys = type({}.keys())
  44. dict_values = type({}.values())
  45. dict_items = type({}.items())
  46. ## misc ##
  47. mappingproxy = type(type.__dict__)
  48. generator = type((lambda: (yield))())
  49. ## coroutine ##
  50. async def _coro(): pass
  51. _coro = _coro()
  52. coroutine = type(_coro)
  53. _coro.close() # Prevent ResourceWarning
  54. del _coro
  55. ### ONE-TRICK PONIES ###
  56. class Hashable(metaclass=ABCMeta):
  57. __slots__ = ()
  58. @abstractmethod
  59. def __hash__(self):
  60. return 0
  61. @classmethod
  62. def __subclasshook__(cls, C):
  63. if cls is Hashable:
  64. for B in C.__mro__:
  65. if "__hash__" in B.__dict__:
  66. if B.__dict__["__hash__"]:
  67. return True
  68. break
  69. return NotImplemented
  70. class Awaitable(metaclass=ABCMeta):
  71. __slots__ = ()
  72. @abstractmethod
  73. def __await__(self):
  74. yield
  75. @classmethod
  76. def __subclasshook__(cls, C):
  77. if cls is Awaitable:
  78. for B in C.__mro__:
  79. if "__await__" in B.__dict__:
  80. if B.__dict__["__await__"]:
  81. return True
  82. break
  83. return NotImplemented
  84. class Coroutine(Awaitable):
  85. __slots__ = ()
  86. @abstractmethod
  87. def send(self, value):
  88. """Send a value into the coroutine.
  89. Return next yielded value or raise StopIteration.
  90. """
  91. raise StopIteration
  92. @abstractmethod
  93. def throw(self, typ, val=None, tb=None):
  94. """Raise an exception in the coroutine.
  95. Return next yielded value or raise StopIteration.
  96. """
  97. if val is None:
  98. if tb is None:
  99. raise typ
  100. val = typ()
  101. if tb is not None:
  102. val = val.with_traceback(tb)
  103. raise val
  104. def close(self):
  105. """Raise GeneratorExit inside coroutine.
  106. """
  107. try:
  108. self.throw(GeneratorExit)
  109. except (GeneratorExit, StopIteration):
  110. pass
  111. else:
  112. raise RuntimeError("coroutine ignored GeneratorExit")
  113. @classmethod
  114. def __subclasshook__(cls, C):
  115. if cls is Coroutine:
  116. mro = C.__mro__
  117. for method in ('__await__', 'send', 'throw', 'close'):
  118. for base in mro:
  119. if method in base.__dict__:
  120. break
  121. else:
  122. return NotImplemented
  123. return True
  124. return NotImplemented
  125. Coroutine.register(coroutine)
  126. class AsyncIterable(metaclass=ABCMeta):
  127. __slots__ = ()
  128. @abstractmethod
  129. def __aiter__(self):
  130. return AsyncIterator()
  131. @classmethod
  132. def __subclasshook__(cls, C):
  133. if cls is AsyncIterable:
  134. if any("__aiter__" in B.__dict__ for B in C.__mro__):
  135. return True
  136. return NotImplemented
  137. class AsyncIterator(AsyncIterable):
  138. __slots__ = ()
  139. @abstractmethod
  140. async def __anext__(self):
  141. """Return the next item or raise StopAsyncIteration when exhausted."""
  142. raise StopAsyncIteration
  143. def __aiter__(self):
  144. return self
  145. @classmethod
  146. def __subclasshook__(cls, C):
  147. if cls is AsyncIterator:
  148. if (any("__anext__" in B.__dict__ for B in C.__mro__) and
  149. any("__aiter__" in B.__dict__ for B in C.__mro__)):
  150. return True
  151. return NotImplemented
  152. class Iterable(metaclass=ABCMeta):
  153. __slots__ = ()
  154. @abstractmethod
  155. def __iter__(self):
  156. while False:
  157. yield None
  158. @classmethod
  159. def __subclasshook__(cls, C):
  160. if cls is Iterable:
  161. if any("__iter__" in B.__dict__ for B in C.__mro__):
  162. return True
  163. return NotImplemented
  164. class Iterator(Iterable):
  165. __slots__ = ()
  166. @abstractmethod
  167. def __next__(self):
  168. 'Return the next item from the iterator. When exhausted, raise StopIteration'
  169. raise StopIteration
  170. def __iter__(self):
  171. return self
  172. @classmethod
  173. def __subclasshook__(cls, C):
  174. if cls is Iterator:
  175. if (any("__next__" in B.__dict__ for B in C.__mro__) and
  176. any("__iter__" in B.__dict__ for B in C.__mro__)):
  177. return True
  178. return NotImplemented
  179. Iterator.register(bytes_iterator)
  180. Iterator.register(bytearray_iterator)
  181. #Iterator.register(callable_iterator)
  182. Iterator.register(dict_keyiterator)
  183. Iterator.register(dict_valueiterator)
  184. Iterator.register(dict_itemiterator)
  185. Iterator.register(list_iterator)
  186. Iterator.register(list_reverseiterator)
  187. Iterator.register(range_iterator)
  188. Iterator.register(set_iterator)
  189. Iterator.register(str_iterator)
  190. Iterator.register(tuple_iterator)
  191. Iterator.register(zip_iterator)
  192. class Generator(Iterator):
  193. __slots__ = ()
  194. def __next__(self):
  195. """Return the next item from the generator.
  196. When exhausted, raise StopIteration.
  197. """
  198. return self.send(None)
  199. @abstractmethod
  200. def send(self, value):
  201. """Send a value into the generator.
  202. Return next yielded value or raise StopIteration.
  203. """
  204. raise StopIteration
  205. @abstractmethod
  206. def throw(self, typ, val=None, tb=None):
  207. """Raise an exception in the generator.
  208. Return next yielded value or raise StopIteration.
  209. """
  210. if val is None:
  211. if tb is None:
  212. raise typ
  213. val = typ()
  214. if tb is not None:
  215. val = val.with_traceback(tb)
  216. raise val
  217. def close(self):
  218. """Raise GeneratorExit inside generator.
  219. """
  220. try:
  221. self.throw(GeneratorExit)
  222. except (GeneratorExit, StopIteration):
  223. pass
  224. else:
  225. raise RuntimeError("generator ignored GeneratorExit")
  226. @classmethod
  227. def __subclasshook__(cls, C):
  228. if cls is Generator:
  229. mro = C.__mro__
  230. for method in ('__iter__', '__next__', 'send', 'throw', 'close'):
  231. for base in mro:
  232. if method in base.__dict__:
  233. break
  234. else:
  235. return NotImplemented
  236. return True
  237. return NotImplemented
  238. Generator.register(generator)
  239. class Sized(metaclass=ABCMeta):
  240. __slots__ = ()
  241. @abstractmethod
  242. def __len__(self):
  243. return 0
  244. @classmethod
  245. def __subclasshook__(cls, C):
  246. if cls is Sized:
  247. if any("__len__" in B.__dict__ for B in C.__mro__):
  248. return True
  249. return NotImplemented
  250. class Container(metaclass=ABCMeta):
  251. __slots__ = ()
  252. @abstractmethod
  253. def __contains__(self, x):
  254. return False
  255. @classmethod
  256. def __subclasshook__(cls, C):
  257. if cls is Container:
  258. if any("__contains__" in B.__dict__ for B in C.__mro__):
  259. return True
  260. return NotImplemented
  261. class Callable(metaclass=ABCMeta):
  262. __slots__ = ()
  263. @abstractmethod
  264. def __call__(self, *args, **kwds):
  265. return False
  266. @classmethod
  267. def __subclasshook__(cls, C):
  268. if cls is Callable:
  269. if any("__call__" in B.__dict__ for B in C.__mro__):
  270. return True
  271. return NotImplemented
  272. ### SETS ###
  273. class Set(Sized, Iterable, Container):
  274. """A set is a finite, iterable container.
  275. This class provides concrete generic implementations of all
  276. methods except for __contains__, __iter__ and __len__.
  277. To override the comparisons (presumably for speed, as the
  278. semantics are fixed), redefine __le__ and __ge__,
  279. then the other operations will automatically follow suit.
  280. """
  281. __slots__ = ()
  282. def __le__(self, other):
  283. if not isinstance(other, Set):
  284. return NotImplemented
  285. if len(self) > len(other):
  286. return False
  287. for elem in self:
  288. if elem not in other:
  289. return False
  290. return True
  291. def __lt__(self, other):
  292. if not isinstance(other, Set):
  293. return NotImplemented
  294. return len(self) < len(other) and self.__le__(other)
  295. def __gt__(self, other):
  296. if not isinstance(other, Set):
  297. return NotImplemented
  298. return len(self) > len(other) and self.__ge__(other)
  299. def __ge__(self, other):
  300. if not isinstance(other, Set):
  301. return NotImplemented
  302. if len(self) < len(other):
  303. return False
  304. for elem in other:
  305. if elem not in self:
  306. return False
  307. return True
  308. def __eq__(self, other):
  309. if not isinstance(other, Set):
  310. return NotImplemented
  311. return len(self) == len(other) and self.__le__(other)
  312. @classmethod
  313. def _from_iterable(cls, it):
  314. '''Construct an instance of the class from any iterable input.
  315. Must override this method if the class constructor signature
  316. does not accept an iterable for an input.
  317. '''
  318. return cls(it)
  319. def __and__(self, other):
  320. if not isinstance(other, Iterable):
  321. return NotImplemented
  322. return self._from_iterable(value for value in other if value in self)
  323. __rand__ = __and__
  324. def isdisjoint(self, other):
  325. 'Return True if two sets have a null intersection.'
  326. for value in other:
  327. if value in self:
  328. return False
  329. return True
  330. def __or__(self, other):
  331. if not isinstance(other, Iterable):
  332. return NotImplemented
  333. chain = (e for s in (self, other) for e in s)
  334. return self._from_iterable(chain)
  335. __ror__ = __or__
  336. def __sub__(self, other):
  337. if not isinstance(other, Set):
  338. if not isinstance(other, Iterable):
  339. return NotImplemented
  340. other = self._from_iterable(other)
  341. return self._from_iterable(value for value in self
  342. if value not in other)
  343. def __rsub__(self, other):
  344. if not isinstance(other, Set):
  345. if not isinstance(other, Iterable):
  346. return NotImplemented
  347. other = self._from_iterable(other)
  348. return self._from_iterable(value for value in other
  349. if value not in self)
  350. def __xor__(self, other):
  351. if not isinstance(other, Set):
  352. if not isinstance(other, Iterable):
  353. return NotImplemented
  354. other = self._from_iterable(other)
  355. return (self - other) | (other - self)
  356. __rxor__ = __xor__
  357. def _hash(self):
  358. """Compute the hash value of a set.
  359. Note that we don't define __hash__: not all sets are hashable.
  360. But if you define a hashable set type, its __hash__ should
  361. call this function.
  362. This must be compatible __eq__.
  363. All sets ought to compare equal if they contain the same
  364. elements, regardless of how they are implemented, and
  365. regardless of the order of the elements; so there's not much
  366. freedom for __eq__ or __hash__. We match the algorithm used
  367. by the built-in frozenset type.
  368. """
  369. MAX = sys.maxsize
  370. MASK = 2 * MAX + 1
  371. n = len(self)
  372. h = 1927868237 * (n + 1)
  373. h &= MASK
  374. for x in self:
  375. hx = hash(x)
  376. h ^= (hx ^ (hx << 16) ^ 89869747) * 3644798167
  377. h &= MASK
  378. h = h * 69069 + 907133923
  379. h &= MASK
  380. if h > MAX:
  381. h -= MASK + 1
  382. if h == -1:
  383. h = 590923713
  384. return h
  385. Set.register(frozenset)
  386. class MutableSet(Set):
  387. """A mutable set is a finite, iterable container.
  388. This class provides concrete generic implementations of all
  389. methods except for __contains__, __iter__, __len__,
  390. add(), and discard().
  391. To override the comparisons (presumably for speed, as the
  392. semantics are fixed), all you have to do is redefine __le__ and
  393. then the other operations will automatically follow suit.
  394. """
  395. __slots__ = ()
  396. @abstractmethod
  397. def add(self, value):
  398. """Add an element."""
  399. raise NotImplementedError
  400. @abstractmethod
  401. def discard(self, value):
  402. """Remove an element. Do not raise an exception if absent."""
  403. raise NotImplementedError
  404. def remove(self, value):
  405. """Remove an element. If not a member, raise a KeyError."""
  406. if value not in self:
  407. raise KeyError(value)
  408. self.discard(value)
  409. def pop(self):
  410. """Return the popped value. Raise KeyError if empty."""
  411. it = iter(self)
  412. try:
  413. value = next(it)
  414. except StopIteration:
  415. raise KeyError
  416. self.discard(value)
  417. return value
  418. def clear(self):
  419. """This is slow (creates N new iterators!) but effective."""
  420. try:
  421. while True:
  422. self.pop()
  423. except KeyError:
  424. pass
  425. def __ior__(self, it):
  426. for value in it:
  427. self.add(value)
  428. return self
  429. def __iand__(self, it):
  430. for value in (self - it):
  431. self.discard(value)
  432. return self
  433. def __ixor__(self, it):
  434. if it is self:
  435. self.clear()
  436. else:
  437. if not isinstance(it, Set):
  438. it = self._from_iterable(it)
  439. for value in it:
  440. if value in self:
  441. self.discard(value)
  442. else:
  443. self.add(value)
  444. return self
  445. def __isub__(self, it):
  446. if it is self:
  447. self.clear()
  448. else:
  449. for value in it:
  450. self.discard(value)
  451. return self
  452. MutableSet.register(set)
  453. ### MAPPINGS ###
  454. class Mapping(Sized, Iterable, Container):
  455. __slots__ = ()
  456. """A Mapping is a generic container for associating key/value
  457. pairs.
  458. This class provides concrete generic implementations of all
  459. methods except for __getitem__, __iter__, and __len__.
  460. """
  461. @abstractmethod
  462. def __getitem__(self, key):
  463. raise KeyError
  464. def get(self, key, default=None):
  465. 'D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.'
  466. try:
  467. return self[key]
  468. except KeyError:
  469. return default
  470. def __contains__(self, key):
  471. try:
  472. self[key]
  473. except KeyError:
  474. return False
  475. else:
  476. return True
  477. def keys(self):
  478. "D.keys() -> a set-like object providing a view on D's keys"
  479. return KeysView(self)
  480. def items(self):
  481. "D.items() -> a set-like object providing a view on D's items"
  482. return ItemsView(self)
  483. def values(self):
  484. "D.values() -> an object providing a view on D's values"
  485. return ValuesView(self)
  486. def __eq__(self, other):
  487. if not isinstance(other, Mapping):
  488. return NotImplemented
  489. return dict(self.items()) == dict(other.items())
  490. Mapping.register(mappingproxy)
  491. class MappingView(Sized):
  492. __slots__ = '_mapping',
  493. def __init__(self, mapping):
  494. self._mapping = mapping
  495. def __len__(self):
  496. return len(self._mapping)
  497. def __repr__(self):
  498. return '{0.__class__.__name__}({0._mapping!r})'.format(self)
  499. class KeysView(MappingView, Set):
  500. __slots__ = ()
  501. @classmethod
  502. def _from_iterable(self, it):
  503. return set(it)
  504. def __contains__(self, key):
  505. return key in self._mapping
  506. def __iter__(self):
  507. yield from self._mapping
  508. KeysView.register(dict_keys)
  509. class ItemsView(MappingView, Set):
  510. __slots__ = ()
  511. @classmethod
  512. def _from_iterable(self, it):
  513. return set(it)
  514. def __contains__(self, item):
  515. key, value = item
  516. try:
  517. v = self._mapping[key]
  518. except KeyError:
  519. return False
  520. else:
  521. return v == value
  522. def __iter__(self):
  523. for key in self._mapping:
  524. yield (key, self._mapping[key])
  525. ItemsView.register(dict_items)
  526. class ValuesView(MappingView):
  527. __slots__ = ()
  528. def __contains__(self, value):
  529. for key in self._mapping:
  530. if value == self._mapping[key]:
  531. return True
  532. return False
  533. def __iter__(self):
  534. for key in self._mapping:
  535. yield self._mapping[key]
  536. ValuesView.register(dict_values)
  537. class MutableMapping(Mapping):
  538. __slots__ = ()
  539. """A MutableMapping is a generic container for associating
  540. key/value pairs.
  541. This class provides concrete generic implementations of all
  542. methods except for __getitem__, __setitem__, __delitem__,
  543. __iter__, and __len__.
  544. """
  545. @abstractmethod
  546. def __setitem__(self, key, value):
  547. raise KeyError
  548. @abstractmethod
  549. def __delitem__(self, key):
  550. raise KeyError
  551. __marker = object()
  552. def pop(self, key, default=__marker):
  553. '''D.pop(k[,d]) -> v, remove specified key and return the corresponding value.
  554. If key is not found, d is returned if given, otherwise KeyError is raised.
  555. '''
  556. try:
  557. value = self[key]
  558. except KeyError:
  559. if default is self.__marker:
  560. raise
  561. return default
  562. else:
  563. del self[key]
  564. return value
  565. def popitem(self):
  566. '''D.popitem() -> (k, v), remove and return some (key, value) pair
  567. as a 2-tuple; but raise KeyError if D is empty.
  568. '''
  569. try:
  570. key = next(iter(self))
  571. except StopIteration:
  572. raise KeyError
  573. value = self[key]
  574. del self[key]
  575. return key, value
  576. def clear(self):
  577. 'D.clear() -> None. Remove all items from D.'
  578. try:
  579. while True:
  580. self.popitem()
  581. except KeyError:
  582. pass
  583. def update(*args, **kwds):
  584. ''' D.update([E, ]**F) -> None. Update D from mapping/iterable E and F.
  585. If E present and has a .keys() method, does: for k in E: D[k] = E[k]
  586. If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v
  587. In either case, this is followed by: for k, v in F.items(): D[k] = v
  588. '''
  589. if not args:
  590. raise TypeError("descriptor 'update' of 'MutableMapping' object "
  591. "needs an argument")
  592. self, *args = args
  593. if len(args) > 1:
  594. raise TypeError('update expected at most 1 arguments, got %d' %
  595. len(args))
  596. if args:
  597. other = args[0]
  598. if isinstance(other, Mapping):
  599. for key in other:
  600. self[key] = other[key]
  601. elif hasattr(other, "keys"):
  602. for key in other.keys():
  603. self[key] = other[key]
  604. else:
  605. for key, value in other:
  606. self[key] = value
  607. for key, value in kwds.items():
  608. self[key] = value
  609. def setdefault(self, key, default=None):
  610. 'D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D'
  611. try:
  612. return self[key]
  613. except KeyError:
  614. self[key] = default
  615. return default
  616. MutableMapping.register(dict)
  617. ### SEQUENCES ###
  618. class Sequence(Sized, Iterable, Container):
  619. """All the operations on a read-only sequence.
  620. Concrete subclasses must override __new__ or __init__,
  621. __getitem__, and __len__.
  622. """
  623. __slots__ = ()
  624. @abstractmethod
  625. def __getitem__(self, index):
  626. raise IndexError
  627. def __iter__(self):
  628. i = 0
  629. try:
  630. while True:
  631. v = self[i]
  632. yield v
  633. i += 1
  634. except IndexError:
  635. return
  636. def __contains__(self, value):
  637. for v in self:
  638. if v == value:
  639. return True
  640. return False
  641. def __reversed__(self):
  642. for i in reversed(range(len(self))):
  643. yield self[i]
  644. def index(self, value, start=0, stop=None):
  645. '''S.index(value, [start, [stop]]) -> integer -- return first index of value.
  646. Raises ValueError if the value is not present.
  647. '''
  648. if start is not None and start < 0:
  649. start = max(len(self) + start, 0)
  650. if stop is not None and stop < 0:
  651. stop += len(self)
  652. i = start
  653. while stop is None or i < stop:
  654. try:
  655. if self[i] == value:
  656. return i
  657. except IndexError:
  658. break
  659. i += 1
  660. raise ValueError
  661. def count(self, value):
  662. 'S.count(value) -> integer -- return number of occurrences of value'
  663. return sum(1 for v in self if v == value)
  664. Sequence.register(tuple)
  665. Sequence.register(str)
  666. Sequence.register(range)
  667. Sequence.register(memoryview)
  668. class ByteString(Sequence):
  669. """This unifies bytes and bytearray.
  670. XXX Should add all their methods.
  671. """
  672. __slots__ = ()
  673. ByteString.register(bytes)
  674. ByteString.register(bytearray)
  675. class MutableSequence(Sequence):
  676. __slots__ = ()
  677. """All the operations on a read-write sequence.
  678. Concrete subclasses must provide __new__ or __init__,
  679. __getitem__, __setitem__, __delitem__, __len__, and insert().
  680. """
  681. @abstractmethod
  682. def __setitem__(self, index, value):
  683. raise IndexError
  684. @abstractmethod
  685. def __delitem__(self, index):
  686. raise IndexError
  687. @abstractmethod
  688. def insert(self, index, value):
  689. 'S.insert(index, value) -- insert value before index'
  690. raise IndexError
  691. def append(self, value):
  692. 'S.append(value) -- append value to the end of the sequence'
  693. self.insert(len(self), value)
  694. def clear(self):
  695. 'S.clear() -> None -- remove all items from S'
  696. try:
  697. while True:
  698. self.pop()
  699. except IndexError:
  700. pass
  701. def reverse(self):
  702. 'S.reverse() -- reverse *IN PLACE*'
  703. n = len(self)
  704. for i in range(n//2):
  705. self[i], self[n-i-1] = self[n-i-1], self[i]
  706. def extend(self, values):
  707. 'S.extend(iterable) -- extend sequence by appending elements from the iterable'
  708. for v in values:
  709. self.append(v)
  710. def pop(self, index=-1):
  711. '''S.pop([index]) -> item -- remove and return item at index (default last).
  712. Raise IndexError if list is empty or index is out of range.
  713. '''
  714. v = self[index]
  715. del self[index]
  716. return v
  717. def remove(self, value):
  718. '''S.remove(value) -- remove first occurrence of value.
  719. Raise ValueError if the value is not present.
  720. '''
  721. del self[self.index(value)]
  722. def __iadd__(self, values):
  723. self.extend(values)
  724. return self
  725. MutableSequence.register(list)
  726. MutableSequence.register(bytearray) # Multiply inheriting, see ByteString