Why is not 'decimal.Decimal(1)' an instance of 'numbers.Real'?

二次信任 提交于 2019-11-28 13:23:38

So, I found the answer directly in the source code of cpython/numbers.py:

## Notes on Decimal
## ----------------
## Decimal has all of the methods specified by the Real abc, but it should
## not be registered as a Real because decimals do not interoperate with
## binary floats (i.e.  Decimal('3.14') + 2.71828 is undefined).  But,
## abstract reals are expected to interoperate (i.e. R1 + R2 should be
## expected to work if R1 and R2 are both Reals).

Indeed, adding Decimal to float would raise a TypeError.

In my point of view, it violates the principle of least astonishment, but it does not matter much.

As a workaround, I use:

import numbers
import decimal

Real = (numbers.Real, decimal.Decimal)

print(isinstance(decimal.Decimal(1), Real))
# True
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!