
On Fri, Feb 13, 2015 at 01:40:48PM +0900, Stephen J. Turnbull wrote:
Donald Stufft writes:
[...]
however being able to type that as new_dict = dict1 + dict2 is more succinct, cleaner, and just a little bit nicer.
Yes, no, and no.
Succint? Yes. Just count characters or lines (but both are deprecated practices in juding Python style).
Cleaner? No. The syntax is cleaner (way fewer explicit operations), but the semantics are muddier for me. At one time or another, at least four different interpretations of "dict addition" have been proposed already:
1. item of left operand wins Ie, "add new keys and their values". This is the one I think of as "add", and it's most analogous to the obvious algorithm for "add-as-in-union" for sets.
2. item of right operand wins Ie, "add new values, inserting new keys as needed". I think of this as "update", its per-item semantics is "replace", but it seems to be the favorite for getting "+" syntax. Eh?
3. keywise addition This is collections.Counter, although there are several plausible treatments of missing values (error, additive identity).
4. keys duplication is an error Strictly speaking nobody has proposed this, but it is implicit in many of the posts that give an example of adding dictionaries with no duplicate keys and say, "it's obvious what d1 + d2 should be". Then there's the variant where duplicate keys with the same value is OK.
Actually, there have been a few posts where people have suggested that duplicated keys should raise an exception. Including one that suggested it would be good for novices but bad for experienced coders.
And in the "adding shopping dicts" example you could plausibly argue for two more:
5. keywise max of values So the first person to the refrigerator always has enough eggs to bake her cake, even if nobody else does.
That's the multiset model.
6. keywise min of values If you are walking to the store.
One more, which was suggested on Stackoverflow: {'spam': 2, 'eggs': 1} + {'ham': 1, 'eggs': 3} => {'ham': 1, 'spam': 2, 'eggs': (1, 3)} -- Steve