NotImplemented used in Decimal

S

Steven D'Aprano

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.
 
K

Kushal Kumaran

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.
 
C

Chris Rebert

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: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 decimal.py

See also NotImplemented's entry in the docs:
http://docs.python.org/reference/datamodel.html#the-standard-type-hierarchy

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.

Cheers,
Chris
 
S

Steven D'Aprano

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.

I knew that works with comparisons __eq__ etc, but somehow I had a mental
blank about arithmetic operators! Yes, you're right, and the docs say so
explicitly. Somehow I had convinced myself that NotImplemented only
worked with comparisons.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Members online

Forum statistics

Threads
473,780
Messages
2,569,611
Members
45,273
Latest member
DamonShoem

Latest Threads

Top