[Python-ideas] Dict joining using + and +=

Ivan Levkivskyi levkivskyi at gmail.com
Mon Mar 4 05:41:19 EST 2019


On Sat, 2 Mar 2019 at 19:15, Raymond Hettinger <raymond.hettinger at gmail.com>
wrote:

>
> > On Mar 1, 2019, at 11:31 AM, Guido van Rossum <guido at 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
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://mail.python.org/pipermail/python-ideas/attachments/20190304/62be43b4/attachment.html>


More information about the Python-ideas mailing list