为什么 'decimal.Decimal(1)' 不是 'numbers.Real' 的实例?
Why is not 'decimal.Decimal(1)' an instance of 'numbers.Real'?
我尝试检查一个变量是否是任何类型(int
、float
、Fraction
、Decimal
等)的实例。
我看到了这个问题及其答案:How to properly use python's isinstance() to check if a variable is a number?
但是,我想排除复数,例如 1j
。
class numbers.Real
looked perfect but it returns False
for Decimal
个数字...
from numbers Real
from decimal import Decimal
print(isinstance(Decimal(1), Real))
# False
矛盾的是,例如 Fraction(1)
它工作正常。
documentation 描述了一些应该与数字一起使用的操作,我在十进制实例上测试它们没有任何错误。
而且小数对象不能包含复数。
那么,为什么 isinstance(Decimal(1), Real)
会 return False
?
于是,直接在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).
确实,将 Decimal
添加到 float
会引发 TypeError
。
在我看来,这违反了最小惊讶原则,但无所谓。
作为解决方法,我使用:
import numbers
import decimal
Real = (numbers.Real, decimal.Decimal)
print(isinstance(decimal.Decimal(1), Real))
# True
我尝试检查一个变量是否是任何类型(int
、float
、Fraction
、Decimal
等)的实例。
我看到了这个问题及其答案:How to properly use python's isinstance() to check if a variable is a number?
但是,我想排除复数,例如 1j
。
class numbers.Real
looked perfect but it returns False
for Decimal
个数字...
from numbers Real
from decimal import Decimal
print(isinstance(Decimal(1), Real))
# False
矛盾的是,例如 Fraction(1)
它工作正常。
documentation 描述了一些应该与数字一起使用的操作,我在十进制实例上测试它们没有任何错误。 而且小数对象不能包含复数。
那么,为什么 isinstance(Decimal(1), Real)
会 return False
?
于是,直接在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).
确实,将 Decimal
添加到 float
会引发 TypeError
。
在我看来,这违反了最小惊讶原则,但无所谓。
作为解决方法,我使用:
import numbers
import decimal
Real = (numbers.Real, decimal.Decimal)
print(isinstance(decimal.Decimal(1), Real))
# True