Steve Dower <steve.do...@python.org> added the comment:

Not sure if this is a big deal or not, and it seems likely that the preexisting 
behaviour of .update() and ** unpacking have already decided it, but is it 
intentional that you end up with the first-seen key and the last-seen value in 
the case of collisions?

class C:
    def __init__(self, *a): self.a = a
    def __hash__(self): return hash(self.a[0])
    def __eq__(self, o): return self.a[0] == o.a[0]
    def __repr__(self): return f"C{self.a}"

>>> c1 = C(1, 1); c1
C(1, 1)
>>> c2 = C(1, 2); c2
C(1, 2)

For set union we get the first seen value:
>>> {c1} | {c2}
{C(1, 1)}

For dict union we get the first seen key and the last seen value:
>>> {c1: 'a'} | {c2: 'b'}
{C(1, 1): 'b'}

But similarly for dict unpack (and .update(); code left as an exercise to the 
reader):
>>> {**{c1: 'a'}, **{c2: 'b'}}
{C(1, 1): 'b'}

So the union of two dicts may contain .items() elements that were not in either 
of the inputs.

Honestly, I've never noticed this before, as the only time I create equivalent 
objects with meaningfully-distinct identities is to use with sets. I just 
figured I'd try it out after seeing suggestions that the dict union operands 
were transposed from set union.

----------
nosy: +steve.dower

_______________________________________
Python tracker <rep...@bugs.python.org>
<https://bugs.python.org/issue36144>
_______________________________________
_______________________________________________
Python-bugs-list mailing list
Unsubscribe: 
https://mail.python.org/mailman/options/python-bugs-list/archive%40mail-archive.com

Reply via email to