ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [Python] isinstance() VS type()
    언어/파이썬 & 장고 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() 비교는 주어진 변수가 하위 클래스가 아닌 특정 유형인지 명시적으로 확인할 때만 사용

    레퍼런스

    https://switowski.com/blog/type-vs-isinstance/

    댓글