2017-11-11 22 views
1

변수가 어떤 숫자의 인스턴스 (예 : int, float, Fraction, Decimal 등)인지 확인하려고합니다.'decimal.Decimal (1)'이 'numbers.Real'의 인스턴스가 아닌 이유는 무엇입니까?

나는이 질문과 대답을 건너 캠 : How to properly use python's isinstance() to check if a variable is a number?

그러나, 나는 그런 1j로 복잡한 숫자를 제외하고 싶습니다.

클래스 numbers.Real

완벽 보았다하지만 False Decimal에 대한 번호 ...

from numbers Real 
from decimal import Decimal 

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

모순에서, 그것은 예를 들어 Fraction(1)와 잘 작동을 반환합니다.

documentation은 숫자와 함께 작동해야하는 몇 가지 연산을 설명하며 소수점 이하의 인스턴스에서 오류없이 테스트했습니다. 10 진수 오브젝트에는 복소수가 포함될 수 없습니다.

그래서 isinstance(Decimal(1), Real)False을 돌려주는 이유는 무엇입니까?

+1

https://docs.python.org/3.6/library/numbers.html#the-numeric-tower –

+0

@TomDalton 나는 그것을 읽을 수 있지만 여전히 이해가 안돼. [Number, Complex, Real, Rational, Integral]에서 t에 대한 isinstance (Decimal (1), t)는'[True, False, False, False, False]를 반환합니다. 'Decimal'이'Number' 인 경우, 왜 그 하위 안경이 아닌지요? – Delgan

답변

1

그래서, 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). 

을하는 TypeError을 올릴 것 floatDecimal를 추가.

필자의 견해로, 그것은 최소한의 놀라움의 원칙을 위반하지만,별로 중요하지 않다.

는이 문제를 해결 내가 사용

import numbers 
import decimal 

Real = (numbers.Real, decimal.Decimal) 

print(isinstance(decimal.Decimal(1), Real)) 
# True