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

Steven D'Aprano steve at pearwood.info
Tue Mar 5 05:21:35 EST 2019


On Mon, Mar 04, 2019 at 10:18:13PM -0800, Amber Yust wrote:

> Adding the + operator for dictionaries feels like it would be a mistake in
> that it offers at most sugar-y benefits, but introduces the significant
> drawback of making it easier to introduced unintended errors.

What sort of errors?

I know that some (mis-)features are "bug magnets" that encourage people 
to write buggy code, but I don't see how this proposal is worse than 
dict.update().

In one way it is better, since D + E returns a new dict, instead of 
over-writing the data in D. Ask any functional programmer, and they'll 
tell you that we should avoid side-effects.


> This would be
> the first instance of "addition" where the result can potentially
> lose/overwrite data (lists and strings both preserve the full extent of
> each operand; Counters include the full value from each operand, etc).

I don't see why this is relevant to addition. It doesn't even apply to 
numeric addition! If I give you the result of an addition:

    101

say, you can't tell what the operands were. And that's not even getting 
into the intricicies of floating point addition, which can violate 
associativity

    ``(a + b) + c`` is not necessarily equal to ``a + (b + c)``

and distributivity:

    ``x*(a + b)`` is not necessarily equal to ``x*a + x*b``


even for well-behaved, numeric floats (not NANs or INFs).


> Combining dictionaries is fundamentally an operation that requires more
> than one piece of information, because there's no single well-defined way
> to combine a pair of them. 

Indeed, But some ways are more useful than others.


> Off the top of my head, I can think of at least
> 2 different common options (replacement aka .update(), combination of
> values a la Counter). Neither of these is really a more valid "addition" of
> dictionaries.

That's why we have subclasses and operator overloading :-)

By far the most commonly requested behaviour for this is copy-and- 
update (or merge, if you prefer). But subclasses are free to define it 
as they will, including:

- add values, as Counter already does;
- raise an exception if there is a duplicate key;
- "first seen wins"

or anything else.



-- 
Steven


More information about the Python-ideas mailing list