gpt4 book ai didi

python - 为什么 'decimal.Decimal(1)' 不是 'numbers.Real' 的实例?

转载 作者:太空狗 更新时间:2023-10-29 18:03:31 25 4
gpt4 key购买 nike

我尝试检查一个变量是否是任意类型(intfloatFraction十进制等)。

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

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

类(class)numbers.Real看起来很完美,但它为 Decimal 返回 False数字...

from numbers Real
from decimal import Decimal

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

矛盾的是,它与 Fraction(1) 一起工作得很好例如。

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

那么,为什么 isinstance(Decimal(1), Real) 会返回 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

关于python - 为什么 'decimal.Decimal(1)' 不是 'numbers.Real' 的实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47237378/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com