13

変数が任意の型 ( intfloatFractionDecimalなど) の数値のインスタンスであるかどうかを確認しようとしています。

私はこの質問とその答えに出くわしました:変数が数値であるかどうかを確認するために python の isinstance() を適切に使用する方法は?

ただし、 などの複素数は除外したいと思い1jます。

クラスnumbers.Realは完璧に見えましたがFalseDecimal数字を返します...

from numbers Real
from decimal import Decimal

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

Fraction(1)矛盾して、たとえば、それはうまく機能します。

ドキュメントには、数値で動作するはずのいくつかの操作が記載されています。10 進数のインスタンスでエラーなしでテストしました。さらに、10 進数オブジェクトに複素数を含めることはできません。

では、なぜ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).

実際、 に追加Decimalするfloatと、 が発生しTypeErrorます。

私の見解では、それは最小の驚きの原則に違反していますが、大した問題ではありません。

回避策として、次を使用します。

import numbers
import decimal

Real = (numbers.Real, decimal.Decimal)

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