언어/파이썬 & 장고
[Python] isinstance() VS type()
불곰1
2024. 3. 13. 01:56
파이썬에서 주어진 인스턴스가 어떤 클래스 또는 타입인지 비교하는 방법은 다음과 같습니다. 각 기능에 대해 설명 후 두 방법의 차이를 설명하도록 합니다.
isinstance()
파이썬 내장함수인 isinstance()는 여러 기능이 있습니다.
1. isinstance(확인하고자 하는 값, 데이터 타입)
print(isinstance("abc", str)) # True
print(isinstance(1234, int)) # True
2. isinstance(확인하고자 하는 인스턴스, 클래스)
class Parent:
pass
parent = Parent()
print(isinstance(parent, Parent)) # True
주의사항
isinstance의 첫 번째 argument는 인스턴스여야 제대로 비교를 진행합니다. 설령 첫 번째, 두 번째에 동일한 클래스를 입력해도 False가 반환되는 것을 볼 수 있습니다.
print(isinstance(Parent, Parent)) # False
3. isinstance(확인하고자 하는 인스턴스, 부모 클래스)
isinstance는 상속 관계도 비교를 하여 동일한 부모 클래스라면 True를 반환합니다.
class Parent:
pass
class Child(Parent):
pass
parent = Parent()
child = Child()
print(isinstance(child, Child)) # True
print(isinstance(child, Parent)) # True
print(isinstance(parent, Child)) # False
4. isinstance(확인하고자 하는 값 또는 인스턴스, (데이터 타입 또는 클래스))
컨테이너 타입 비교인 in절과 비슷하게 두 번째에 튜플 형식으로 주어 하나의 타입이라도 만족한다면 True를 반환하도록 할 수 있습니다. 이때, 두 번째 값은 무조건 튜플 형식이여만 하고 이외의 컨테이너 타입은 에러를 반환합니다.
class One:
pass
class Two:
pass
class Parent:
pass
class Child(Parent):
pass
parent = Parent()
child = Child()
print(isinstance(1234, (str, int, tuple))) # True
print(isinstance(child, (One, Two))) # False
print(isinstance(child, (One, Two, Child))) # True
print(isinstance(child, (One, Two, Parent))) # True
print(isinstance(child, (Parent, int))) # True
type()
타입을 사용해 비교하는 방법은 간단합니다.
class Parent:
pass
class Child(Parent):
pass
parent = Parent()
child = Child()
print(type(1234) == int) # True
print(type("abc") == str) # True
print(type("abc") is str) # True
print(type(child) == Child) # True
print(type(child) == Parent) # False
print(type(Child) == Child) # False
여기서 isinstance()와 다른 부분은 type() 비교는 상속관계는 따지지 않는 다는 것입니다.
주의사항
위 코드에서 문자열 비교는 ==와 is로 두 방법을 보여줬는데 변수가 문자열인지 확인하려는 경우에는 "is" 연산자가 더 적합합니다. 변수의 값을 확인하려는 경우 ==를 사용합니다.
s = "abcd"
type(s) is str # 타입 비교
s == "abcd # 값 비교
isinstance() VS type()
두 방식의 속도 차이는 다음과 같습니다.
import timeit
variable = 'hello'
def _isinstance():
return isinstance(variable, str)
def _type():
return type(variable) is str
t = timeit.repeat('_isinstance()', setup='from __main__ import _isinstance', number=10_000_000, repeat=10)
print(sum(t) / 10)
# 0.9007226209000001
t1 = timeit.repeat('_type()', setup='from __main__ import _type', number=10_000_000, repeat=10)
print(sum(t1) / 10)
# 1.0284106169
isinstance()가 type() 비교에 비해 대략 14% 정도 빠릅니다.
type() 비교는 주어진 변수가 하위 클래스가 아닌 특정 유형인지 명시적으로 확인할 때만 사용하고 이외의 상황에서는 isinstance()를 사용하는 것이 더 효율적으로 보입니다.
요약
- type()에 비해 isinstance()가 더 많은 기능이 있고 더 빠름
- type() 비교는 주어진 변수가 하위 클래스가 아닌 특정 유형인지 명시적으로 확인할 때만 사용