NotImplemented used in Decimal

Chris Rebert clp2 at
Sat Apr 24 08:51:39 CEST 2010

On Fri, Apr 23, 2010 at 11:25 PM, Steven D'Aprano
<steve at> wrote:
> On Sat, 24 Apr 2010 09:05:14 +0530, Kushal Kumaran wrote:
>> On Sat, Apr 24, 2010 at 8:54 AM, Steven D'Aprano
>> <steve at> wrote:
>>> I'm reading the source code for decimal.Decimal, and I see that the
>>> arithmetic operations (__add__, __sub__, etc.) start with code like
>>> this:
>>>        if other is NotImplemented:
>>>            return other
>>> I don't understand the purpose of this. I presume that it is *not* for
>>> the use-case of:
>>> d = Decimal('123.456')
>>> result = d + NotImplemented
>>> which not only doesn't make sense to me, but when I try it, it raises
>>> TypeError. So I find myself confused why the arithmetic methods do
>>> this.
>> There's a _convert_other method which is called before the test that can
>> return NotImplemented.
> Yes, I can see that, but why?

If the conversion to Decimal in  _convert_other() fails, the operator
method returns NotImplemented to signal to the interpreter that
Decimal doesn't know how to do the requested operation with an operand
of the given type; the interpreter will fall back by calling the
reflected method of the other operand. And if that also fails, the
interpreter raises TypeError:
>>> Decimal(4)+'g'
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
TypeError: unsupported operand type(s) for +: 'Decimal' and 'str'

Note how the traceback doesn't mention

See also NotImplemented's entry in the docs:

Now, they could have had _convert_other() return some other sentinel
value (or raise an exception) to indicate that the conversion failed,
but they didn't; it probably made the code marginally simpler.


More information about the Python-list mailing list