inconsistency with += between different types ?

Andreas Leitgeb Andreas.Leitgeb at siemens.at
Wed Aug 7 05:43:47 EDT 2002


Huaiyu Zhu <huaiyu at gauss.almadan.ibm.com> wrote:
> Andreas Leitgeb <Andreas.Leitgeb at siemens.at> wrote:
>>Huaiyu Zhu <huaiyu at gauss.almadan.ibm.com> wrote:
>>> That's what it should be.  Yet it is possible for whoever writes __iadd__ to
>>> define it the other way.  
>>Is there something I've missed, or [...]

> The thing missing is that the return statement plays an unnecessarily big
> role here.  
> ...  if you define __iadd__, by
> returning an object other than self.
> By the way, if you forget to return self, you rebind the name to None.

Thanks, now (I think) I finally got it:
__iadd__ is SUPPOSED to modify self's attributes and then "return self"

If __iadd__ does return anything else than self, then it actually
breaks the intended semantics for __iadd__, but not the syntax - 
it's still legal python.

This of course explains, why it causes that much trouble.
A possible path to change this situation might be as follows: 
(Although I feel too new at Python to actually propose a change :-)
  Automatically treat a None returnvalue from an __ixxx__-method as self
  Issue a Warning, if __ixxx__ returns anything else than self or None
  Ignore the return-value altogether.
Each of these steps might have to wait for a major-version-step in
Python.
This would make sure that clean implementations would stay ok, while
those implementations, that obfuscate the design of <op>= will hopefully
phase out.

> class A:
>   def __iadd__(self,x): print x
Good demonstration of a nasty pitfall.

-- 
Newsflash: Sproingy made it to the ground !
  read more ... <http://avl.enemy.org/sproingy/>



More information about the Python-list mailing list