Guido van Rossum <gu...@python.org> added the comment:

OK, that makes sense, it works similar to ChainMap.copy(), which copies maps[0] 
and keeps links to the rest. So in particular `cm | {}` will do the same thing 
as cm.copy().

Im not sure if the dict(other) cast is the best way to go about it. Maybe this 
would work?

def __or__(self, other):
    new = self.copy()
    new |= other  # OR new.update(other) ???
    return new

def __ior__(self, other):
    self.update(other)
    return self

Note that there is no ChainMap.update() definition -- it relies on 
MutableMapping.update().

I guess we need a __ror__ as well, in case there's some other mapping that 
doesn't implement __or__:

def __ror__(self, other):
    new = other.copy()
    new.update(self)
    return new

Note that this doesn't return a ChainMap but an instance of type(other).  If 
other doesn't have a copy() method it'll fail.

As a refinement, __or__ and __ror__ should perhaps check whether the operation 
can possibly succeed and return NotImplemented instead of raising? (Based on 
the type of other only, not its contents.)

----------

_______________________________________
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