This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

classification
Title: automatically try forward operations when reverse operations are NotImplemented
Type: enhancement Stage:
Components: Interpreter Core Versions: Python 3.1, Python 2.7, Python 2.6, Python 2.5
process
Status: closed Resolution: rejected
Dependencies: Superseder:
Assigned To: Nosy List: Michael.Gilbert, georg.brandl, r.david.murray
Priority: normal Keywords:

Created on 2010-07-28 17:56 by Michael.Gilbert, last changed 2022-04-11 14:57 by admin. This issue is now closed.

Messages (4)
msg111833 - (view) Author: Michael Gilbert (Michael.Gilbert) Date: 2010-07-28 17:56
in order to make overrides simpler, and more obvious to average developers, it would be very useful to automatically call the forward operations (e.g. __mul__) when the reverse operations (e.g. __rmul__) are NotImplemented.  

i spent quite a bit of time trying to discover why x*3 worked (where x is a class that i created with a __mul__ method); whereas 3*x wouldn't. this feature would really help since in most applications the same behavior is expected from forward and reverse operations.

for now, i am content with doing this manually, but it would be nice if it were automated.  all of my reverse operations just do:

    def __rmul__( self , other ):
        return self.__mul__( other )

where i manually check the type of other in the forward operation, and then handle it appropriately.

thanks for considering this.

best wishes,
mike
msg111941 - (view) Author: Georg Brandl (georg.brandl) * (Python committer) Date: 2010-07-29 14:42
This might work for (normally) commutative operations like multiplication and addition, but what about those like subtraction?  If the interpreter uses the non-reversed method automatically, it has to apply semantics, but the semantics depend on the type and cannot be guessed by the interpreter.  Also, even for normally commutative operations some type may want to behave non-commutative.  With this in mind, this cannot be implemented without major headaches both for the implementation and backwards compatibility.
msg116965 - (view) Author: Michael Gilbert (Michael.Gilbert) Date: 2010-09-20 19:55
i think that, for example, the default __rsub__ implementation could be:

  return self + -other

which should just do the right thing assuming the addition and negation functions already do the right thing for the class type.

anyway, any implementation should leave the option to override the default __r*__ methods, which would keep the implementation backwards compatible as well.

can i keep this open as a feature request?

thanks,
mike
msg117233 - (view) Author: R. David Murray (r.david.murray) * (Python committer) Date: 2010-09-23 20:56
No, but you could bring it up on python-ideas.  (It would have to wait until after the moratorium in any case.)
History
Date User Action Args
2022-04-11 14:57:04adminsetgithub: 53647
2010-09-23 20:56:04r.david.murraysetnosy: + r.david.murray
messages: + msg117233
2010-09-20 19:55:05Michael.Gilbertsetmessages: + msg116965
2010-07-29 14:42:51georg.brandlsetstatus: open -> closed

nosy: + georg.brandl
messages: + msg111941

resolution: rejected
2010-07-28 17:56:55Michael.Gilbertcreate