On Thursday, October 23, 2014 11:46:02 AM UTC-7, João Alberto Ferreira 
wrote:
>
> I am running the following Python example from the book "Learning 
> Python", from Mark Lutz and David Ascher, but Sage is returning a 
> TypeError after presenting the correct response. Can anyone explain me 
> why? I've found this very strange. 
>
> sage: class Commuter: 
> ....:     def __init__(self, val): 
> ....:         self.val = val 
> ....:     def __add__(self, other): 
> ....:         print "add", self.val, other 
> ....:     def __radd__(self, other): 
> ....:         print "radd", self.val, other 
> ....: 
> sage: x = Commuter(88) 
> sage: y = Commuter(99)  
> sage: x + 1 
> add 88 1 
> sage: 1 + y 
> radd 99 1 
>

The problem is caused by the fact that your __radd__ implementation returns 
"None". If you insert a return command for a non-None value, the example 
works as expected.

Indeed Sage binary operations internally do not dispatch via __add__ and 
__radd__, but __radd__ is tried as a fall-back at some point. If you call 
1+y then you're running Integer(1).__add__(y). This does not figure out a 
way to do the addition. Apparently, sage chooses to not return 
NotImplemented (allowing python to call __radd__), but calls __radd__ 
itself and still raises an error when the return value is None.

There may be a good reason why Sage chooses to call __radd__ manually 
rather than let python do the work by returning NotImplemented, but if 
there's not perhaps it would be better to stay closer to python's standard?

-- 
You received this message because you are subscribed to the Google Groups 
"sage-support" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to sage-support+unsubscr...@googlegroups.com.
To post to this group, send email to sage-support@googlegroups.com.
Visit this group at http://groups.google.com/group/sage-support.
For more options, visit https://groups.google.com/d/optout.

Reply via email to