# Copyright 2007 Google, Inc. All Rights Reserved.# Licensed to PSF under a Contributor Agreement."""Abstract Base Classes (ABCs) for collections, according to PEP 3119.Unit tests are in test_collections."""############ Maintenance notes ########################################### ABCs are different from other standard library modules in that they# specify compliance tests. In general, once an ABC has been published,# new methods (either abstract or concrete) cannot be added.## Though classes that inherit from an ABC would automatically receive a# new mixin method, registered classes would become non-compliant and# violate the contract promised by ``isinstance(someobj, SomeABC)``.## Though irritating, the correct procedure for adding new abstract or# mixin methods is to create a new ABC as a subclass of the previous# ABC. For example, union(), intersection(), and difference() cannot# be added to Set but could go into a new ABC that extends Set.## Because they are so hard to change, new ABCs should have their APIs# carefully thought through prior to publication.## Since ABCMeta only checks for the presence of methods, it is possible# to alter the signature of a method by adding optional arguments# or changing parameters names. This is still a bit dubious but at# least it won't cause isinstance() to return an incorrect result.#########################################################################fromabcimportABCMeta,abstractmethodimportsysGenericAlias=type(list[int])EllipsisType=type(...)def_f():passFunctionType=type(_f)del_f__all__=["Awaitable","Coroutine","AsyncIterable","AsyncIterator","AsyncGenerator","Hashable","Iterable","Iterator","Generator","Reversible","Sized","Container","Callable","Collection","Set","MutableSet","Mapping","MutableMapping","MappingView","KeysView","ItemsView","ValuesView","Sequence","MutableSequence","ByteString","Buffer",]# This module has been renamed from collections.abc to _collections_abc to# speed up interpreter startup. Some of the types such as MutableMapping are# required early but collections module imports a lot of other modules.# See issue #19218__name__="collections.abc"# Private list of types that we want to register with the various ABCs# so that they will pass tests like:# it = iter(somebytearray)# assert isinstance(it, Iterable)# Note: in other implementations, these types might not be distinct# and they may have their own implementation specific types that# are not included on this list.bytes_iterator=type(iter(b''))bytearray_iterator=type(iter(bytearray()))#callable_iterator = ???dict_keyiterator=type(iter({}.keys()))dict_valueiterator=type(iter({}.values()))dict_itemiterator=type(iter({}.items()))list_iterator=type(iter([]))list_reverseiterator=type(iter(reversed([])))range_iterator=type(iter(range(0)))longrange_iterator=type(iter(range(1<<1000)))set_iterator=type(iter(set()))str_iterator=type(iter(""))tuple_iterator=type(iter(()))zip_iterator=type(iter(zip()))## views ##dict_keys=type({}.keys())dict_values=type({}.values())dict_items=type({}.items())## misc ##mappingproxy=type(type.__dict__)def_get_framelocalsproxy():returntype(sys._getframe().f_locals)framelocalsproxy=_get_framelocalsproxy()del_get_framelocalsproxygenerator=type((lambda:(yield))())## coroutine ##asyncdef_coro():pass_coro=_coro()coroutine=type(_coro)_coro.close()# Prevent ResourceWarningdel_coro## asynchronous generator ##asyncdef_ag():yield_ag=_ag()async_generator=type(_ag)del_ag### ONE-TRICK PONIES ###def_check_methods(C,*methods):mro=C.__mro__formethodinmethods:forBinmro:ifmethodinB.__dict__:ifB.__dict__[method]isNone:returnNotImplementedbreakelse:returnNotImplementedreturnTrueclassHashable(metaclass=ABCMeta):__slots__=()@abstractmethoddef__hash__(self):return0@classmethoddef__subclasshook__(cls,C):ifclsisHashable:return_check_methods(C,"__hash__")returnNotImplementedclassAwaitable(metaclass=ABCMeta):__slots__=()@abstractmethoddef__await__(self):yield@classmethoddef__subclasshook__(cls,C):ifclsisAwaitable:return_check_methods(C,"__await__")returnNotImplemented__class_getitem__=classmethod(GenericAlias)classCoroutine(Awaitable):__slots__=()@abstractmethoddefsend(self,value):"""Send a value into the coroutine. Return next yielded value or raise StopIteration. """raiseStopIteration@abstractmethoddefthrow(self,typ,val=None,tb=None):"""Raise an exception in the coroutine. Return next yielded value or raise StopIteration. """ifvalisNone:iftbisNone:raisetypval=typ()iftbisnotNone:val=val.with_traceback(tb)raisevaldefclose(self):"""Raise GeneratorExit inside coroutine. """try:self.throw(GeneratorExit)except(GeneratorExit,StopIteration):passelse:raiseRuntimeError("coroutine ignored GeneratorExit")@classmethoddef__subclasshook__(cls,C):ifclsisCoroutine:return_check_methods(C,'__await__','send','throw','close')returnNotImplementedCoroutine.register(coroutine)classAsyncIterable(metaclass=ABCMeta):__slots__=()@abstractmethoddef__aiter__(self):returnAsyncIterator()@classmethoddef__subclasshook__(cls,C):ifclsisAsyncIterable:return_check_methods(C,"__aiter__")returnNotImplemented__class_getitem__=classmethod(GenericAlias)classAsyncIterator(AsyncIterable):__slots__=()@abstractmethodasyncdef__anext__(self):"""Return the next item or raise StopAsyncIteration when exhausted."""raiseStopAsyncIterationdef__aiter__(self):returnself@classmethoddef__subclasshook__(cls,C):ifclsisAsyncIterator:return_check_methods(C,"__anext__","__aiter__")returnNotImplementedclassAsyncGenerator(AsyncIterator):__slots__=()asyncdef__anext__(self):"""Return the next item from the asynchronous generator. When exhausted, raise StopAsyncIteration. """returnawaitself.asend(None)@abstractmethodasyncdefasend(self,value):"""Send a value into the asynchronous generator. Return next yielded value or raise StopAsyncIteration. """raiseStopAsyncIteration@abstractmethodasyncdefathrow(self,typ,val=None,tb=None):"""Raise an exception in the asynchronous generator. Return next yielded value or raise StopAsyncIteration. """ifvalisNone:iftbisNone:raisetypval=typ()iftbisnotNone:val=val.with_traceback(tb)raisevalasyncdefaclose(self):"""Raise GeneratorExit inside coroutine. """try:awaitself.athrow(GeneratorExit)except(GeneratorExit,StopAsyncIteration):passelse:raiseRuntimeError("asynchronous generator ignored GeneratorExit")@classmethoddef__subclasshook__(cls,C):ifclsisAsyncGenerator:return_check_methods(C,'__aiter__','__anext__','asend','athrow','aclose')returnNotImplementedAsyncGenerator.register(async_generator)classIterable(metaclass=ABCMeta):__slots__=()@abstractmethoddef__iter__(self):whileFalse:yieldNone@classmethoddef__subclasshook__(cls,C):ifclsisIterable:return_check_methods(C,"__iter__")returnNotImplemented__class_getitem__=classmethod(GenericAlias)classIterator(Iterable):__slots__=()@abstractmethoddef__next__(self):'Return the next item from the iterator. When exhausted, raise StopIteration'raiseStopIterationdef__iter__(self):returnself@classmethoddef__subclasshook__(cls,C):ifclsisIterator:return_check_methods(C,'__iter__','__next__')returnNotImplementedIterator.register(bytes_iterator)Iterator.register(bytearray_iterator)#Iterator.register(callable_iterator)Iterator.register(dict_keyiterator)Iterator.register(dict_valueiterator)Iterator.register(dict_itemiterator)Iterator.register(list_iterator)Iterator.register(list_reverseiterator)Iterator.register(range_iterator)Iterator.register(longrange_iterator)Iterator.register(set_iterator)Iterator.register(str_iterator)Iterator.register(tuple_iterator)Iterator.register(zip_iterator)classReversible(Iterable):__slots__=()@abstractmethoddef__reversed__(self):whileFalse:yieldNone@classmethoddef__subclasshook__(cls,C):ifclsisReversible:return_check_methods(C,"__reversed__","__iter__")returnNotImplementedclassGenerator(Iterator):__slots__=()def__next__(self):"""Return the next item from the generator. When exhausted, raise StopIteration. """returnself.send(None)@abstractmethoddefsend(self,value):"""Send a value into the generator. Return next yielded value or raise StopIteration. """raiseStopIteration@abstractmethoddefthrow(self,typ,val=None,tb=None):"""Raise an exception in the generator. Return next yielded value or raise StopIteration. """ifvalisNone:iftbisNone:raisetypval=typ()iftbisnotNone:val=val.with_traceback(tb)raisevaldefclose(self):"""Raise GeneratorExit inside generator. """try:self.throw(GeneratorExit)except(GeneratorExit,StopIteration):passelse:raiseRuntimeError("generator ignored GeneratorExit")@classmethoddef__subclasshook__(cls,C):ifclsisGenerator:return_check_methods(C,'__iter__','__next__','send','throw','close')returnNotImplementedGenerator.register(generator)classSized(metaclass=ABCMeta):__slots__=()@abstractmethoddef__len__(self):return0@classmethoddef__subclasshook__(cls,C):ifclsisSized:return_check_methods(C,"__len__")returnNotImplementedclassContainer(metaclass=ABCMeta):__slots__=()@abstractmethoddef__contains__(self,x):returnFalse@classmethoddef__subclasshook__(cls,C):ifclsisContainer:return_check_methods(C,"__contains__")returnNotImplemented__class_getitem__=classmethod(GenericAlias)classCollection(Sized,Iterable,Container):__slots__=()@classmethoddef__subclasshook__(cls,C):ifclsisCollection:return_check_methods(C,"__len__","__iter__","__contains__")returnNotImplementedclassBuffer(metaclass=ABCMeta):__slots__=()@abstractmethoddef__buffer__(self,flags:int,/)->memoryview:raiseNotImplementedError@classmethoddef__subclasshook__(cls,C):ifclsisBuffer:return_check_methods(C,"__buffer__")returnNotImplementedclass_CallableGenericAlias(GenericAlias):""" Represent `Callable[argtypes, resulttype]`. This sets ``__args__`` to a tuple containing the flattened ``argtypes`` followed by ``resulttype``. Example: ``Callable[[int, str], float]`` sets ``__args__`` to ``(int, str, float)``. """__slots__=()def__new__(cls,origin,args):ifnot(isinstance(args,tuple)andlen(args)==2):raiseTypeError("Callable must be used as Callable[[arg, ...], result].")t_args,t_result=argsifisinstance(t_args,(tuple,list)):args=(*t_args,t_result)elifnot_is_param_expr(t_args):raiseTypeError(f"Expected a list of types, an ellipsis, "f"ParamSpec, or Concatenate. Got {t_args}")returnsuper().__new__(cls,origin,args)def__repr__(self):iflen(self.__args__)==2and_is_param_expr(self.__args__[0]):returnsuper().__repr__()return(f'collections.abc.Callable'f'[[{", ".join([_type_repr(a)forainself.__args__[:-1]])}], 'f'{_type_repr(self.__args__[-1])}]')def__reduce__(self):args=self.__args__ifnot(len(args)==2and_is_param_expr(args[0])):args=list(args[:-1]),args[-1]return_CallableGenericAlias,(Callable,args)def__getitem__(self,item):# Called during TypeVar substitution, returns the custom subclass# rather than the default types.GenericAlias object. Most of the# code is copied from typing's _GenericAlias and the builtin# types.GenericAlias.ifnotisinstance(item,tuple):item=(item,)new_args=super().__getitem__(item).__args__# args[0] occurs due to things like Z[[int, str, bool]] from PEP 612ifnotisinstance(new_args[0],(tuple,list)):t_result=new_args[-1]t_args=new_args[:-1]new_args=(t_args,t_result)return_CallableGenericAlias(Callable,tuple(new_args))def_is_param_expr(obj):"""Checks if obj matches either a list of types, ``...``, ``ParamSpec`` or ``_ConcatenateGenericAlias`` from typing.py """ifobjisEllipsis:returnTrueifisinstance(obj,list):returnTrueobj=type(obj)names=('ParamSpec','_ConcatenateGenericAlias')returnobj.__module__=='typing'andany(obj.__name__==namefornameinnames)def_type_repr(obj):"""Return the repr() of an object, special-casing types (internal helper). Copied from :mod:`typing` since collections.abc shouldn't depend on that module. (Keep this roughly in sync with the typing version.) """ifisinstance(obj,type):ifobj.__module__=='builtins':returnobj.__qualname__returnf'{obj.__module__}.{obj.__qualname__}'ifobjisEllipsis:return'...'ifisinstance(obj,FunctionType):returnobj.__name__returnrepr(obj)classCallable(metaclass=ABCMeta):__slots__=()@abstractmethoddef__call__(self,*args,**kwds):returnFalse@classmethoddef__subclasshook__(cls,C):ifclsisCallable:return_check_methods(C,"__call__")returnNotImplemented__class_getitem__=classmethod(_CallableGenericAlias)### SETS ###classSet(Collection):"""A set is a finite, iterable container. This class provides concrete generic implementations of all methods except for __contains__, __iter__ and __len__. To override the comparisons (presumably for speed, as the semantics are fixed), redefine __le__ and __ge__, then the other operations will automatically follow suit. """__slots__=()def__le__(self,other):ifnotisinstance(other,Set):returnNotImplementediflen(self)>len(other):returnFalseforeleminself:ifelemnotinother:returnFalsereturnTruedef__lt__(self,other):ifnotisinstance(other,Set):returnNotImplementedreturnlen(self)<len(other)andself.__le__(other)def__gt__(self,other):ifnotisinstance(other,Set):returnNotImplementedreturnlen(self)>len(other)andself.__ge__(other)def__ge__(self,other):ifnotisinstance(other,Set):returnNotImplementediflen(self)<len(other):returnFalseforeleminother:ifelemnotinself:returnFalsereturnTruedef__eq__(self,other):ifnotisinstance(other,Set):returnNotImplementedreturnlen(self)==len(other)andself.__le__(other)@classmethoddef_from_iterable(cls,it):'''Construct an instance of the class from any iterable input. Must override this method if the class constructor signature does not accept an iterable for an input. '''returncls(it)def__and__(self,other):ifnotisinstance(other,Iterable):returnNotImplementedreturnself._from_iterable(valueforvalueinotherifvalueinself)__rand__=__and__defisdisjoint(self,other):'Return True if two sets have a null intersection.'forvalueinother:ifvalueinself:returnFalsereturnTruedef__or__(self,other):ifnotisinstance(other,Iterable):returnNotImplementedchain=(eforsin(self,other)foreins)returnself._from_iterable(chain)__ror__=__or__def__sub__(self,other):ifnotisinstance(other,Set):ifnotisinstance(other,Iterable):returnNotImplementedother=self._from_iterable(other)returnself._from_iterable(valueforvalueinselfifvaluenotinother)def__rsub__(self,other):ifnotisinstance(other,Set):ifnotisinstance(other,Iterable):returnNotImplementedother=self._from_iterable(other)returnself._from_iterable(valueforvalueinotherifvaluenotinself)def__xor__(self,other):ifnotisinstance(other,Set):ifnotisinstance(other,Iterable):returnNotImplementedother=self._from_iterable(other)return(self-other)|(other-self)__rxor__=__xor__def_hash(self):"""Compute the hash value of a set. Note that we don't define __hash__: not all sets are hashable. But if you define a hashable set type, its __hash__ should call this function. This must be compatible __eq__. All sets ought to compare equal if they contain the same elements, regardless of how they are implemented, and regardless of the order of the elements; so there's not much freedom for __eq__ or __hash__. We match the algorithm used by the built-in frozenset type. """MAX=sys.maxsizeMASK=2*MAX+1n=len(self)h=1927868237*(n+1)h&=MASKforxinself:hx=hash(x)h^=(hx^(hx<<16)^89869747)*3644798167h&=MASKh^=(h>>11)^(h>>25)h=h*69069+907133923h&=MASKifh>MAX:h-=MASK+1ifh==-1:h=590923713returnhSet.register(frozenset)classMutableSet(Set):"""A mutable set is a finite, iterable container. This class provides concrete generic implementations of all methods except for __contains__, __iter__, __len__, add(), and discard(). To override the comparisons (presumably for speed, as the semantics are fixed), all you have to do is redefine __le__ and then the other operations will automatically follow suit. """__slots__=()@abstractmethoddefadd(self,value):"""Add an element."""raiseNotImplementedError@abstractmethoddefdiscard(self,value):"""Remove an element. Do not raise an exception if absent."""raiseNotImplementedErrordefremove(self,value):"""Remove an element. If not a member, raise a KeyError."""ifvaluenotinself:raiseKeyError(value)self.discard(value)defpop(self):"""Return the popped value. Raise KeyError if empty."""it=iter(self)try:value=next(it)exceptStopIteration:raiseKeyErrorfromNoneself.discard(value)returnvaluedefclear(self):"""This is slow (creates N new iterators!) but effective."""try:whileTrue:self.pop()exceptKeyError:passdef__ior__(self,it):forvalueinit:self.add(value)returnselfdef__iand__(self,it):forvaluein(self-it):self.discard(value)returnselfdef__ixor__(self,it):ifitisself:self.clear()else:ifnotisinstance(it,Set):it=self._from_iterable(it)forvalueinit:ifvalueinself:self.discard(value)else:self.add(value)returnselfdef__isub__(self,it):ifitisself:self.clear()else:forvalueinit:self.discard(value)returnselfMutableSet.register(set)### MAPPINGS ###classMapping(Collection):"""A Mapping is a generic container for associating key/value pairs. This class provides concrete generic implementations of all methods except for __getitem__, __iter__, and __len__. """__slots__=()# Tell ABCMeta.__new__ that this class should have TPFLAGS_MAPPING set.__abc_tpflags__=1<<6# Py_TPFLAGS_MAPPING@abstractmethoddef__getitem__(self,key):raiseKeyErrordefget(self,key,default=None):'D.get(k[,d]) -> D[k] if k in D, else d. d defaults to None.'try:returnself[key]exceptKeyError:returndefaultdef__contains__(self,key):try:self[key]exceptKeyError:returnFalseelse:returnTruedefkeys(self):"D.keys() -> a set-like object providing a view on D's keys"returnKeysView(self)defitems(self):"D.items() -> a set-like object providing a view on D's items"returnItemsView(self)defvalues(self):"D.values() -> an object providing a view on D's values"returnValuesView(self)def__eq__(self,other):ifnotisinstance(other,Mapping):returnNotImplementedreturndict(self.items())==dict(other.items())__reversed__=NoneMapping.register(mappingproxy)Mapping.register(framelocalsproxy)classMappingView(Sized):__slots__='_mapping',def__init__(self,mapping):self._mapping=mappingdef__len__(self):returnlen(self._mapping)def__repr__(self):return'{0.__class__.__name__}({0._mapping!r})'.format(self)__class_getitem__=classmethod(GenericAlias)classKeysView(MappingView,Set):__slots__=()@classmethoddef_from_iterable(cls,it):returnset(it)def__contains__(self,key):returnkeyinself._mappingdef__iter__(self):yield fromself._mappingKeysView.register(dict_keys)classItemsView(MappingView,Set):__slots__=()@classmethoddef_from_iterable(cls,it):returnset(it)def__contains__(self,item):key,value=itemtry:v=self._mapping[key]exceptKeyError:returnFalseelse:returnvisvalueorv==valuedef__iter__(self):forkeyinself._mapping:yield(key,self._mapping[key])ItemsView.register(dict_items)classValuesView(MappingView,Collection):__slots__=()def__contains__(self,value):forkeyinself._mapping:v=self._mapping[key]ifvisvalueorv==value:returnTruereturnFalsedef__iter__(self):forkeyinself._mapping:yieldself._mapping[key]ValuesView.register(dict_values)
[docs]classMutableMapping(Mapping):"""A MutableMapping is a generic container for associating key/value pairs. This class provides concrete generic implementations of all methods except for __getitem__, __setitem__, __delitem__, __iter__, and __len__. """__slots__=()@abstractmethoddef__setitem__(self,key,value):raiseKeyError@abstractmethoddef__delitem__(self,key):raiseKeyError__marker=object()
[docs]defpop(self,key,default=__marker):'''D.pop(k[,d]) -> v, remove specified key and return the corresponding value. If key is not found, d is returned if given, otherwise KeyError is raised. '''try:value=self[key]exceptKeyError:ifdefaultisself.__marker:raisereturndefaultelse:delself[key]returnvalue
[docs]defpopitem(self):'''D.popitem() -> (k, v), remove and return some (key, value) pair as a 2-tuple; but raise KeyError if D is empty. '''try:key=next(iter(self))exceptStopIteration:raiseKeyErrorfromNonevalue=self[key]delself[key]returnkey,value
[docs]defclear(self):'D.clear() -> None. Remove all items from D.'try:whileTrue:self.popitem()exceptKeyError:pass
[docs]defupdate(self,other=(),/,**kwds):''' D.update([E, ]**F) -> None. Update D from mapping/iterable E and F. If E present and has a .keys() method, does: for k in E.keys(): D[k] = E[k] If E present and lacks .keys() method, does: for (k, v) in E: D[k] = v In either case, this is followed by: for k, v in F.items(): D[k] = v '''ifisinstance(other,Mapping):forkeyinother:self[key]=other[key]elifhasattr(other,"keys"):forkeyinother.keys():self[key]=other[key]else:forkey,valueinother:self[key]=valueforkey,valueinkwds.items():self[key]=value
[docs]defsetdefault(self,key,default=None):'D.setdefault(k[,d]) -> D.get(k,d), also set D[k]=d if k not in D'try:returnself[key]exceptKeyError:self[key]=defaultreturndefault
MutableMapping.register(dict)### SEQUENCES ###classSequence(Reversible,Collection):"""All the operations on a read-only sequence. Concrete subclasses must override __new__ or __init__, __getitem__, and __len__. """__slots__=()# Tell ABCMeta.__new__ that this class should have TPFLAGS_SEQUENCE set.__abc_tpflags__=1<<5# Py_TPFLAGS_SEQUENCE@abstractmethoddef__getitem__(self,index):raiseIndexErrordef__iter__(self):i=0try:whileTrue:v=self[i]yieldvi+=1exceptIndexError:returndef__contains__(self,value):forvinself:ifvisvalueorv==value:returnTruereturnFalsedef__reversed__(self):foriinreversed(range(len(self))):yieldself[i]defindex(self,value,start=0,stop=None):'''S.index(value, [start, [stop]]) -> integer -- return first index of value. Raises ValueError if the value is not present. Supporting start and stop arguments is optional, but recommended. '''ifstartisnotNoneandstart<0:start=max(len(self)+start,0)ifstopisnotNoneandstop<0:stop+=len(self)i=startwhilestopisNoneori<stop:try:v=self[i]exceptIndexError:breakifvisvalueorv==value:returnii+=1raiseValueErrordefcount(self,value):'S.count(value) -> integer -- return number of occurrences of value'returnsum(1forvinselfifvisvalueorv==value)Sequence.register(tuple)Sequence.register(str)Sequence.register(range)Sequence.register(memoryview)class_DeprecateByteStringMeta(ABCMeta):def__new__(cls,name,bases,namespace,**kwargs):ifname!="ByteString":importwarningswarnings._deprecated("collections.abc.ByteString",remove=(3,14),)returnsuper().__new__(cls,name,bases,namespace,**kwargs)def__instancecheck__(cls,instance):importwarningswarnings._deprecated("collections.abc.ByteString",remove=(3,14),)returnsuper().__instancecheck__(instance)classByteString(Sequence,metaclass=_DeprecateByteStringMeta):"""This unifies bytes and bytearray. XXX Should add all their methods. """__slots__=()ByteString.register(bytes)ByteString.register(bytearray)classMutableSequence(Sequence):"""All the operations on a read-write sequence. Concrete subclasses must provide __new__ or __init__, __getitem__, __setitem__, __delitem__, __len__, and insert(). """__slots__=()@abstractmethoddef__setitem__(self,index,value):raiseIndexError@abstractmethoddef__delitem__(self,index):raiseIndexError@abstractmethoddefinsert(self,index,value):'S.insert(index, value) -- insert value before index'raiseIndexErrordefappend(self,value):'S.append(value) -- append value to the end of the sequence'self.insert(len(self),value)defclear(self):'S.clear() -> None -- remove all items from S'try:whileTrue:self.pop()exceptIndexError:passdefreverse(self):'S.reverse() -- reverse *IN PLACE*'n=len(self)foriinrange(n//2):self[i],self[n-i-1]=self[n-i-1],self[i]defextend(self,values):'S.extend(iterable) -- extend sequence by appending elements from the iterable'ifvaluesisself:values=list(values)forvinvalues:self.append(v)defpop(self,index=-1):'''S.pop([index]) -> item -- remove and return item at index (default last). Raise IndexError if list is empty or index is out of range. '''v=self[index]delself[index]returnvdefremove(self,value):'''S.remove(value) -- remove first occurrence of value. Raise ValueError if the value is not present. '''delself[self.index(value)]def__iadd__(self,values):self.extend(values)returnselfMutableSequence.register(list)MutableSequence.register(bytearray)# Multiply inheriting, see ByteString