[Python-ideas] PEP: Dict addition and subtraction

Paul Moore p.f.moore at gmail.com
Thu Mar 21 13:43:26 EDT 2019


On Thu, 21 Mar 2019 at 17:27, Rémi Lapeyre <remi.lapeyre at henki.fr> wrote:
>
> Le 21 mars 2019 à 17:43:31, Steven D'Aprano
> (steve at pearwood.info(mailto:steve at pearwood.info)) a écrit:
>
> > I'd like to make a plea to people:
> >
> > I get it, there is now significant opposition to using the + symbol for
> > this proposed operator. At the time I wrote the first draft of the PEP,
> > there was virtually no opposition to it, and the | operator had very
> > little support. This has clearly changed.
> >
> > At this point I don't think it is productive to keep making subjective
> > claims that + will be more confusing or surprising. You've made your
> > point that you don't like it, and the next draft^1 of the PEP will make
> > that clear.
> >
> > But if you have *concrete examples* of code that currently is easy to
> > understand, but will be harder to understand if we add dict.__add__,
> > then please do show me!
> >
> > For those who oppose the + operator, it will help me if you made it
> > clear whether it is *just* the + symbol you dislike, and would accept
> > the | operator instead, or whether you hate the whole operator concept
> > regardless of how it is spelled.
>
> Thanks for the work you are doing on this PEP and for debunking my
> misconceptions regarding types, I’m currently learning a lot about them.
>
> I don’t know if it matters but I’m in favor of the method
>
> > And to those who support this PEP, code examples where a dict merge
> > operator will help are most welcome!
>
> Not matter the notation you end up choosing, I think this code:
> https://github.com/jpadilla/pyjwt/blob/master/jwt/utils.py#L71-L81
>
> which is part of a widely used library to validate JWTs would greatly
> benefit from a new merge to merge dicts. (This package is 78 on
> https://hugovk.github.io/top-pypi-packages/)

It's already got a function that does the job. How much benefit is
there *really* from being able to replace it with d1 + d2 once you
drop support for Python < 3.8? But point taken that new code would
have been able to avoid the function in the first place.

... or would it?

def merge_dict(original, updates):
    if not updates:
        return original

With the  + operator. d1 + None will fail with an error. With your
code, updates=None means "return the original unchanged". Does that
matter with your current code?

The point is that in many real world cases, you'd write a function
*anyway*, to handle corner cases, and a new operator doesn't make much
difference at that point.

Having said all of that, I'm mostly indifferent to the idea of having
a built in "dictionary merge" capability - I doubt I'd use it *much*,
but if it were there I'm sure I'd find useful it on the odd occasion.
I'm somewhat against an operator, I really don't see why this couldn't
be a method (although the asymmetry in d1.merge(d2) makes me have a
mild preference for a class method or standalone function). I can't
form an opinion between + and |, I find | significantly uglier (I tend
to avoid using it for sets, in favour of the union method) but I am
mildly uncomfortable with more overloading of +.

Serious suggestion - why not follow the lead of sets, and have *both*
an operator and a method? And if you think that's a bad idea, it would
be worth considering *why* it's a bad idea for dictionaries, when it's
OK for sets (and "well, I didn't like it when sets did it" isn't
sufficient ;-))

And having said that, I'll go back to lurking and not really caring
one way or the other.

Paul


More information about the Python-ideas mailing list