On Fri, Mar 19, 2010 at 03:46:07PM +0300, Alex A. Naanou wrote: > >>> class C(object): > ... def __radd__(self, other): > ... print 'C: adding C and %s objects.' % other.__class__.__name__ > ... > >>> 1 + c > C: adding C and int objects. > > My first expectation would be to get a TypeError here, as ints indeed > have an __add__ method, and they do not know anything about C objects > (obviously :) ). On second thought, giving client code priority to > handle things has it's merits. > > The problem is that I found no mention of this behavior in the docs.
It's well-known and documented behavior. It's what r-methods are for. See http://docs.python.org/reference/datamodel.html#emulating-numeric-types "These methods are called to implement the binary arithmetic operations (+, -, *, /, %, divmod(), pow(), **, <<, >>, &, ^, |) with reflected (swapped) operands. These functions are only called if the left operand does not support the corresponding operation and the operands are of different types. [3] For instance, to evaluate the expression x - y, where y is an instance of a class that has an __rsub__() method, y.__rsub__(x) is called if x.__sub__(y) returns NotImplemented." Oleg. -- Oleg Broytman http://phd.pp.ru/ p...@phd.pp.ru Programmers don't die, they just GOSUB without RETURN. _______________________________________________ Python-Dev mailing list Python-Dev@python.org http://mail.python.org/mailman/listinfo/python-dev Unsubscribe: http://mail.python.org/mailman/options/python-dev/archive%40mail-archive.com