Michael Foord wrote:
Nick Coghlan wrote:
- ProxyMixin correctly delegates in-place assignment operations via the __i*__ methods (note however that using in-place assignment will remove the proxy wrapper, just as it does for weakref.proxy)
Couldn't in place operations wrap the return value with a proxy?
They could, but I tried to copy as much behaviour as possible from weakref.proxy which loses the proxy wrapper when you do an in-place operation:
from weakref import proxy as p class MyInt(int): pass ... x = MyInt(1) px = p(x) px <weakproxy at 0xb768f11c to MyInt at 0xb768d86c> px += 1 px 2
class MyList(list): pass ... y = MyList([]) py = p(y) py <weakproxy at 0xb768f16c to MyList at 0xb768f0f4> py += [] py []
That said, it wouldn't be hard (and might make more sense) to redefine the proxied in-place operations along the following lines: # See tracker item for _deref/_unwrap definitions def __iadd__(self, other): target = _deref(self) result = target + _unwrap(other) if result is target: # Mutated in-place, keep same proxy result = self else: # Returned a different object, make a new proxy result = type(self)(result) return result However, if we did something like that, I'd prefer to see the weakref.proxy implementation change to provide similar semantics. Cheers, Nick. -- Nick Coghlan | ncoghlan@gmail.com | Brisbane, Australia --------------------------------------------------------------- http://www.boredomandlaziness.org