목록에 isinstance 유형이 있는지 Python 확인?


90

비단 법적으로 어떻게합니까?

var = 7.0
var_is_good = isinstance(var, classinfo1) or isinstance(var, classinfo2) or isinstance(var, classinfo3) or ... or  isinstance(var, classinfoN)

classinfo의 목록을 전달할 수 없다는 것은 어리석은 것 같습니다.

var_is_good = isinstanceofany( var, [classinfo1, classinfo2, ... , classinfoN] )

그렇다면 isinstanceofany기능 은 무엇 입니까?


숫자처럼 더하고, 빼고, 숫자처럼 곱하면 ... 왜 숫자인지 알아야할까요? 자세한 내용은 오리 타이핑 을 참조하십시오.
Makoto

내 특별한 사용 사례는 (반환하는 함수 ( numberOR 또는 sympy 표현식을 반환 함))를 반환하는 함수가 있습니다. 내가 생성 한 함수가 다른 함수에 전달할 때 수행해야하는 작업을 수행하는지 확인하고 싶습니다.
D Adams

함수가 균질 한 것을 반환하지 않는 이유는 무엇입니까? 그것이 바로 여기에있는 냄새입니다. 덕 타이핑으로 빠르고 느슨해 질 수 있지만 반환하는 내용은 일관성이 있어야합니다.
Makoto

나는 때때로 숫자로 평가되고 때로는 그 안에 변수가 남아있는 sympy 표현식을 항상 반환 할 수 있다고 생각합니다.
D Adams

그것이 제가 여기서하고 싶은 일입니다. 여러 다른 유형을 반환하는 대신 한 유형을 반환하고 필요한 경우 대신 숫자로 줄이십시오.
Makoto

답변:


200

isinstance()두 번째 인수에 대한 클래스 튜플 을 받습니다 . 첫 번째 인수가 해당 시퀀스의 유형 하나의 인스턴스이면 true를 반환합니다 .

isinstance(var, (classinfo1, classinfo2, classinfo3))

즉, 은 (는 ) isinstance() 이미이 기능을 즉시 제공하고 있습니다.

로부터 isinstance()문서 :

classinfo 가 클래스 객체도 아니고 유형 객체도 아닌 경우 , 클래스 또는 유형 객체의 튜플이거나 다른 튜플을 재귀 적으로 포함 할 수 있습니다 (다른 시퀀스 유형은 허용되지 않음).

내 강조; 재귀 적 특성에 유의하십시오. (classinfo1, (classinfo2, classinfo3))또한 유효한 옵션입니다.


12

당신은 이미 질문의 제목에 꽤 가깝습니다. any및 목록을 사용할 수 있습니다 .

var = 7.0
var_is_good = any([isinstance(var, classinfo1),
                   isinstance(var, classinfo2),
                   isinstance(var, classinfo3), ...
                   isinstance(var, classinfoN)])

그러나 isinstance공개 문서를 보면 :

객체 인수가 classinfo 인수의 인스턴스이거나 (직접, 간접 또는 가상) 하위 클래스의 인스턴스이면 true를 반환합니다. 객체가 주어진 유형의 객체가 아니면 함수는 항상 false를 반환합니다. classinfo가 클래스 (유형 객체)가 아닌 경우 객체 유형 의 튜플 이거나 이러한 다른 튜플을 재귀 적으로 포함 할 수 있습니다 (다른 시퀀스 유형은 허용되지 않음). classinfo가 유형 또는 유형의 튜플 및 이러한 튜플이 아니면 TypeError 예외가 발생합니다.

이것은 더 나은 방법은

var = 7.0
var_is_good = isinstance(var, (classinfo1,
                               classinfo2,
                               classinfo3,
                               ...,
                               classinfoN))

2
변화하는 isinstance것만으로 반복 classinfo하는 것은 나에게 그다지 비단뱀처럼 보이지 않습니다.
Makoto

1
시도해보십시오 var.__class__. 너가 원하는게 그거야? @Makoto : 동의합니다. 전혀 Pythonic이 아닙니다!
플라멩코

@Makoto Yup. 그러나 그것은 아마도 D Adams가 문서에서 "any"를 검색함으로써 쉽게 찾을 수 있었던 것입니다. 나는 더 나은 버전으로 내 대답을 확장했지만 분명히 Martijn Pieters가 더 빨랐습니다 ... 다시 한 번.
Martin Thoma

3
any()목록이있는 것은 .. 무의미합니다. 를 사용해야하는 경우 생성기 표현식을 사용하면 any()최소한 조기 종료의 이점을 얻을 수 있습니다.
Martijn Pieters

isinstancewith tuple이 갈 길이 라고 생각합니다 . 나는 any그가 제목에서 요구하는 것처럼 보였기 때문에 해결책을 언급하고 싶었습니다 .
Martin Thoma

4

이렇게하면 문제가 해결됩니다.

valid_instance_types = <tuple of types you want to allow>
var_is_good = isinstance(var, valid_instance_types)

문서를 기반으로 유형의 값을 isinstance.

이것이 단지 일부에 불과한 더 복잡한 검증을 시도하는 경우 에도 육감적 일 수 있습니다 .


isinstance ()는 이미이 기능을 제공합니다. 두 번째 인수로 확인하는 데 필요한 모든 유형이 포함 된 튜플을 전달합니다.
RFV

@ RFV5s 예 .... 여기에 제공된 예가 보여줍니다. 당신의 이의는 무엇입니까?
나다니엘 포드

1

일반적으로을 사용해서는 isinstance안되지만 원하는 것은 any () 내장 함수 로 수행 할 수 있습니다 .

var_is_good = any(isinstance(var, t) for t in [type1, type2, type3])

7
이것은 과잉입니다. isinstance()를 사용하지 않고 바로 사용할 수있는 기능을 제공합니다 any().
Martijn Pieters

@MartijnPieters 나는 isinstance가 여러 유형을 취할 수 있다는 것을 깨닫지 못했지만, 질문은 "특정 함수의 반환 값이 있는지 어떻게 확인합니까? with different params is true "
Chad S.

사용 여부 isinstance()는 관련이 없습니다.
RFV

@ChadS. 왜 그가 사용하지 말아야한다고 생각 isinstance()하십니까? 감사합니다.
idature

파이썬은 유형 검사를 피하기 때문입니다. 약간의 이익을 위해 많은 추가 코드 (및 CPU주기)입니다. 덕 타이핑이 선호됩니다.
Chad S.
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.