> On Mar 4, 2019, at 11:24 AM, Guido van Rossum <gu...@python.org> wrote:
> 
> * Regarding how often this is needed, we know that this is proposed and 
> discussed at length every few years, so I think this will fill a real need.

I'm not sure that conclusion follows from the premise :-)  Some ideas get 
proposed routinely because they are obvious things to propose, not because 
people actually need them.  One hint is that the proposals always have generic 
variable names, "d = d1 + d2", and another is that they are almost never 
accompanied by actual use cases or real code that would be made better. I 
haven't seen anyone in this thread say they would use this more than once a 
year or that their existing code was unclear or inefficient in any way.  The 
lack of dict addition support in other languages (like Java example) is another 
indicator that there isn't a real need -- afaict there is nothing about Python 
that would cause us to have a unique requirement that other languages don't 
have.

FWIW, there are some downsides to the proposal -- it diminishes some of the 
unifying ideas about Python that I typically present on the first day of class:

* One notion is that the APIs nudge users toward good code.  The "copy.copy()" 
function has to be imported -- that minor nuisance is a subtle hint that 
copying isn't good for you.  Likewise for dicts, writing "e=d.copy(); 
e.update(f)" is a minor nuisance that either serves to dissuade people from 
unnecessary copying or at least will make very clear what is happening.  The 
original motivating use case for ChainMap() was to make a copy free replacement 
for excessively slow dict additions in ConfigParser.  Giving a plus-operator to 
mappings is an invitation to writing code that doesn't scale well.

* Another unifying notion is that the star-operator represents repeat addition 
across multiple data types.  It is a nice demo to show that "a * 5 == a + a + a 
+ a + a" where "a" is an int, float, complex, str, bytes, tuple, or list.  
Giving __add__() to dicts breaks this pattern.

* When teaching dunder methods, the usual advice regarding operators is to use 
them only when their meaning is unequivocal; otherwise, have a preference for 
named methods where the method name clarifies what is being done -- don't use 
train+car to mean train.shunt_to_middle(car). For dicts that would mean not 
having the plus-operator implement something that isn't inherently additive (it 
applies replace/overwrite logic instead), that isn't commutative, and that 
isn't linear when applied in succession (d1+d2+d3).

* In the advanced class where C extensions are covered, the organization of the 
slots is shown as a guide to which methods make sense together: tp_as_number, 
tp_as_sequence, and tp_as_mapping.  For dicts to gain the requisite methods, 
they will have to become numbers (in the sense of filling out the tp_as_number 
slots).  That will slow down the abstract methods that search the slot groups, 
skipping over groups marked as NULL.  It also exposes method groups that don't 
typically appear together, blurring their distinction.

* Lastly, there is a vague piece of zen-style advice, "if many things in the 
language have to change to implement idea X, it stops being worth it".   In 
this case, it means that every dict-like API and the related abstract methods 
and typing equivalents would need to grow support for addition in mappings 
(would it even make sense to add to shelve objects or os.environ objects 
together?)

That's my two cents worth.  I'm ducking out now (nothing more to offer on the 
subject). Guido's participation in the thread has given it an air of 
inevitability so this post will likely not make a difference.


Raymond


_______________________________________________
Python-ideas mailing list
Python-ideas@python.org
https://mail.python.org/mailman/listinfo/python-ideas
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to