On Sat, 2 Mar 2019 at 19:15, Raymond Hettinger <raymond.hettin...@gmail.com> wrote:
> > > On Mar 1, 2019, at 11:31 AM, Guido van Rossum <gu...@python.org> wrote: > > > > There's a compromise solution for this possible. We already do this for > Sequence and MutableSequence: Sequence does *not* define __add__, but > MutableSequence *does* define __iadd__, and the default implementation just > calls self.update(other). I propose the same for Mapping (do nothing) and > MutableMapping: make the default __iadd__ implementation call > self.update(other). > > Usually, it's easy to add methods to classes without creating disruption, > but ABCs are more problematic. If MutableMapping grows an __iadd__() > method, what would that mean for existing classes that register as > MutableMapping but don't already implement __iadd__? When "isinstance(m, > MutableMapping)" returns True, is it a promise that the API is fully > implemented? Is this something that mypy could would or should complain > about? > Just to clarify the situation, currently Mapping and MutableMapping are not protocols from both runtime and mypy points of view. I.e. they don't have the structural __subclasshook__() (as e.g. Iterable), and are not declared as Protocol in typeshed. So to implement these (and be considered a subtype by mypy) one needs to explicitly subclass them (register() isn't supported by mypy). This means that adding a new method will not cause any problems here, since the new method will be non-abstract with a default implementation that calls update() (the same way as for MutableSequence). The only potential for confusion I see is if there is a class that de-facto implements current MutableMapping API and made a subclass (at runtime) of MutableMapping using register(). Then after we add __iadd__, users of that class might expect that __iadd__ is implemented, while it might be not. This is however OK I think, since register() is already non type safe. Also there is a simple way to find if there are any subclassses of MutableMapping in typeshed that don't have __iadd__: one can *try* declaring MutableMapping.__iadd__ as abstract, and mypy will error on all such subclasses. -- Ivan
_______________________________________________ Python-ideas mailing list Python-ideas@python.org https://mail.python.org/mailman/listinfo/python-ideas Code of Conduct: http://python.org/psf/codeofconduct/