
At 03:12 PM 9/28/2005 +0200, Reinhold Birkenfeld wrote:
Hi,
a general question. Consider:
class A(list): def __setitem__(self, index, item): # do something with index and item return list.__setitem__(self, index, item)
lst = A([1,set()])
lst[0] |= 1
lst[1] |= set([1])
Do we want lst.__setitem__ to be called in the second inplace assignment?
Yes. See: http://www.python.org/2.0/new-python.html#SECTION000700000000000000000 The purpose of the augmented assignment forms is to allow for the possibility that the item's __i*__ method may or may not exist, and may or may not return the same object. In the case where there is no __i*__ form, or it does not return the same object, the lvalue *must* be re-bound to the new value, or the semantics break.
A case where this matters is here: http://python.org/sf/1306777
I've closed it as invalid; the behavior is as-defined. In principle, there *could* be an optimization to avoid rebinding the lvalue in the case where the __i*__ form did return self. But using it for the purpose of allowing augmented assignment to tuple members seems dubious at best, and likely to create confusion about the mutability or lack thereof of tuples. IMO it's better to have augmented assignment to tuple members always fail, so that the code has to be a little more specific about its intent.