_collections_abc.py 26 KB

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