Guido van Rossum wrote:
> So the choice is really only three way.
> 1) Add d1 + d2 and d1 += d2 (using similarity with list + and +=)
> 2) Add d1 | d2 and d1 |= d2 (similar to set | and |=)
> 3) Do nothing
> We're not going to introduce a brand new operator for this purpose, nor are
> we going to use a different existing operator.

I didn't mean to argue for another operator, but rather to point out that 
i.m.o. "+" is not a good choice, for similar reasons why I think 
`collections.deque` shouldn't support "+" (regarding ambiguity of precedence 
and potential "loss" of data). Besides for `dict` even more interpretations of 
the meaning of "+" are plausible.

Regarding "|" operator, I think a drawback is the resemblance with "or" (after 
all it's associated with "__or__") so people might assume behavior similar to 
`x or y` where `x` takes precedence (for truthy values of `x`). So when reading 
`d1 | d2` one could falsely assume that values in `d1` take precedence over the 
ones in `d2` for conflicting keys. And this is also the existing `set` behavior 
(though it's not really relevant in this case):

    >>> class Test:
    ...     def __init__(self, x):
    ...             self.x = x
    ...     def __hash__(self):
    ...             return 0
    ...     def __eq__(self, other):
    ...             return True
    ... 
    >>> s = {Test(1)} | {Test(2)}
    >>> s.pop().x  # leftmost wins.
    1

> The asymmetry of the operation (in case there are matching keys with
> conflicting values) doesn't bother me, nor does the behavior of Counter
> affect how I feel about this.
> The += or |= operator will have to behave identical to d1.update(d2) when
> it comes to matching keys.
> I'm not sure whether += or |= needs to be an exact alias for dict.update.
> For lists, += and .extend() behave identically: both accept arbitrary
> sequences as right argument. But for sets, |= requires the right argument
> to be a set, while set.update() does not. (The not-in-place operators
> always require matching types: l1 + l2 requires l2 to be a list, s1 | s2
> requires s2 to be a set.) But this is only a second-order consistency issue
> -- we should probably just follow the operator we're choosing in the end,
> either + or |.
> IMO the reason this is such a tough choice is that Python learners are
> typically introduced to list and dict early on, while sets are introduced
> later. However, the tutorial on docs.python.org covers sets before dicts --
> but lists are covered much earlier, and dicts make some cameo appearances
> in the section on control flow. Perhaps more typical, the tutorial at
> https://www.tutorialspoint.com/python/
> discusses data types in this order:
> numbers, strings, lists, tuples, dictionary, date&time -- it doesn't
> mention sets at all. This matches Python's historical development (sets
> weren't added until Python 2.3).
> So if we want to cater to what most beginners will know, + and += would be
> the best choice. But if we want to be more future-proof and consistent, |
> and |= are best -- after all dicts are closer to sets (both are hash
> tables) than to lists. (I know you can argue that dicts are closer to lists
> because both support __getitem__ -- but I find that similarity shallower
> than the hash table nature.)
> In the end I'm +0.5 on | and |=, +0 on + and +=, and -0 on doing nothing.
_______________________________________________
Python-ideas mailing list -- python-ideas@python.org
To unsubscribe send an email to python-ideas-le...@python.org
https://mail.python.org/mailman3/lists/python-ideas.python.org/
Message archived at 
https://mail.python.org/archives/list/python-ideas@python.org/message/7FGQHBNJ6QN5QN2QC377UN6IF6CJ5ZRC/
Code of Conduct: http://python.org/psf/codeofconduct/

Reply via email to