On 15/03/2019 18:54, Raymond Hettinger wrote:
So, we have to ask whether we're stretching too far from "operators are good" to "we 
need this operator".  Here are some considerations:

Frequency of usage:   Math provides ∑ and ∏ because they are common. It doesn't 
provide a special operator for sqrt(c**2 - b**2) because the latter is less 
fundamental and less common.  To me, f=d.copy() followed by f.update(e) arises 
so rarely that an operator isn't warranted.  The existing code is already 
concise, clear, and rare.

I think the "less fundamental" in your argument is more relevant than the "less common". Mathematicians will cheerfully invent operators for whatever is fundamental to their field and then use them twice in a paper, but still write out fully common combinations. I would suggest that merging is merging is a fairly fundamental operation for dictionaries, so is a good candidate for an operator.

The combination "f=d.copy(); f.update(e)" is rare in my code. I suspect that's partly because it doesn't occur to me that I can do it. Guido's argument about recognisability is strong here. I know that dict.update() exists, and that I can destructively merge dictionaries. The extra step of doing the copy first for a non-destructive merge makes for a much less memorable pattern, to the point where I just don't think of it unless it would be more than usually useful. "f = d | e" (however it gets spelled) is much easier to remember the existence of.

Familiarity:  We know about + because we use it a lot in addition and concatenation contexts. However, a symbol like ⊗ is more opaque unless we're 
using it every day for a particular purpose.  To me, the "+" operator implies "add/extend" semantics rather than 
"replace" semantics.  Successive applications of "+" are never idempotent unless one operand is an identity element.  So for me, 
"+" isn't familiar for dict merges.  Loosely put, it isn't "plus-like".  I think this is why so many other languages decided not 
use "+" for dict merges even when that would have been a trivially easy implementation choice.

I'm beginning to be swayed by the arguments that merging is more "or-like" and the right analogy is with set union. Personally I don't find "|" for set union at all obvious, but that argument was lost long ago, and like I said it's just personal. I don't have the same problem you have with the semantics of "+", but when I was a maths student I was used to using "+" as an entirely generic operator not necessarily meaning addition, so it's probably just me.

Obviousness: When working with "+" on numeric types, it is obvious it should be commutative. When using 
"+" when sequence types, it is obvious that concatenation is non-commutative. When using "+" for 
mapping types, it is not obvious that it isn't commutative. Likewise, it isn't obvious that "+" is a 
destructive operation for mappings (consider that adding to a log file never destroys existing log entries, while 
updating a dict will overwrite existing values).

I suspect this is a bit personal; I had sufficiently evil lecturers in my university Algebra course that I still don't automatically take the commutativity of "+" over a particular group as a given :-) Nothing is obvious unless you already know it.

(There is a probably apocryphal tale of a lecturer in full flow saying "It is obvious that..." and pausing. He then turned to the blackboard and scribbled furiously in one corner for five minutes. "I was right," he said triumphantly, "it is obvious!")

Harmony: The operators on dict views use "|" but regular dicts would use "+". 
That doesn't seem harmonious.

Yes, that's probably the killer argument against "+", damn it.

Impact: When a class in the standard library adds a method or operator, the 
reverberations are felt only locally.  In contrast, the dict API is 
fundamental.  Changing it will reverberate for years. It will be felt in the 
ABCs, typeshed, and every mapping-like object.  IMO such an impactful change 
should only be made if it adds significant new functionality rather than 
providing a slightly shorter spelling of something we already have.

I am inclined that adding significant new utility (which this does) is also a good enough reason to make such an impactful change.

--
Rhodri James *-* Kynesim Ltd
_______________________________________________
Python-ideas mailing list
[email protected]
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to