비단 법적으로 어떻게합니까?
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
기능 은 무엇 입니까?
답변
isinstance()
두 번째 인수에 대한 클래스 튜플 을 받습니다 . 첫 번째 인수가 해당 시퀀스의 유형 중 하나의 인스턴스이면 true를 반환합니다 .
isinstance(var, (classinfo1, classinfo2, classinfo3))
즉, 은 (는 ) isinstance()
이미이 기능을 즉시 제공하고 있습니다.
로부터 isinstance()
문서 :
classinfo 가 클래스 객체도 아니고 유형 객체도 아닌 경우 , 클래스 또는 유형 객체의 튜플이거나 다른 튜플을 재귀 적으로 포함 할 수 있습니다 (다른 시퀀스 유형은 허용되지 않음).
내 강조; 재귀 적 특성에 유의하십시오. (classinfo1, (classinfo2, classinfo3))
또한 유효한 옵션입니다.
답변
당신은 이미 질문의 제목에 꽤 가깝습니다. 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))
답변
이렇게하면 문제가 해결됩니다.
valid_instance_types = <tuple of types you want to allow>
var_is_good = isinstance(var, valid_instance_types)
문서를 기반으로 유형의 값을 isinstance
.
이것이 단지 일부에 불과한 더 복잡한 검증을 시도하는 경우 에도 육감적 일 수 있습니다 .
답변
일반적으로을 사용해서는 isinstance
안되지만 원하는 것은 any () 내장 함수 로 수행 할 수 있습니다 .
var_is_good = any(isinstance(var, t) for t in [type1, type2, type3])