13

我尝试检查一个变量是否是任何类型(intfloatFractionDecimal等)的多个实例。

我遇到了这个问题及其答案:How to proper use python's isinstance() to check if a variable is a number?

但是,我想排除复数,例如1j.

这门课numbers.Real看起来很完美,但它返回FalseDecimal数字......

from numbers Real
from decimal import Decimal

print(isinstance(Decimal(1), Real))
# False

与此相反,它适用Fraction(1)于例如。

文档描述了一些应该使用数字的操作,我在十进制实例上测试它们没有任何错误。此外,十进制对象不能包含复数。

那么,为什么isinstance(Decimal(1), Real)会返回False呢?

4

1 回答 1

14

所以,我直接在源代码中找到了答案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).

实际上,添加Decimaltofloat会提高TypeError.

在我看来,它违反了最小惊讶的原则,但这并不重要。

作为一种解决方法,我使用:

import numbers
import decimal

Real = (numbers.Real, decimal.Decimal)

print(isinstance(decimal.Decimal(1), Real))
# True
于 2017-11-12T10:37:36.723 回答