반응형

Python3 타입검사(Type Check)

타입에 필자 생각

C/C++ 에서 주로 개발을 한 사람(필자의 경우) 입장에서는 자바스크립트나 파이썬처럼 변수(라고 쓰고 객체라고 읽고 쓰더라)의 형이 자유로운 경우 형이 바뀐 경우 문법상 문제가 없기 때문에 잘못된 변수 사용하는 것에 걱정을 한다. 그리고 결국 컴퓨터에서 동작하기 때문에 변수는 자유롭게 받는 것에 비해 타입 에러도 있다. 때문에 몇몇 유명한 개발자는 파이썬을 안좋게 본다. 그러나 이런 관점과 요구사항은 항상 개선책이 나오는 원동력이 되는 것 같다. 파이썬도 타입검사 메서드가 제공되면서 C++ 스타일의 코딩이 가능하기 때문이다.

type() vs isInstance()

입문자를 위한 서적에서는 대부분 type() 메서드를 잠시 소개했던 것으로 기억한다. 아마 isInstance()도 소개를 한다면, 시대가 많이 바뀌었거나 해당 입문서가 수준이 높다고 생각해야 한다.

type()

type() 메서드의 경우 입문서에서 소개한 것과 같이 파이썬에서 기본적으로 제공하는 자료형에 대해서 구분이 가능하다.

예시)

type(1) is int
# True
type([]) is list
# True
a = 1
b = 3
type(a) is type(b)
# True

그러나 이 type()의 한계는 class의 인스턴스의 경우 해당되는 클래스의 인스턴스인지만 확인을 한다. C++ 처럼 상속의 경우는 고려가 되지 않아서 상속받은 클래스의 인스턴스를 알아 볼 수 없다.

예시)

class Test1:
    pass
class Test2(Test1):
    pass

a = Test1()
b = Test2()
type(a) is Test1
# True
type(b) is Test2
# True
type(b) is Test1
# False

isInstance()

type()의 한계점을 해결해주는 것이 isInstance() 메서드이다. 개발자가 임으로 만든 class의 인스턴스의 특정 클래스인지 검사할 경우 자식 클래스의 인스턴스도 True로 리턴을 해준다. 때문에 개발자는 구현을 하면서 타입에 느슨한 연결을 구현을 좀 더 안전하게 할 수 있다.

예시)

class Test1:
    pass
class Test2(Test1):
    pass

a = Test1()
b = Test2()
isInstance(a, Test1)
# True
isInstance(b, Test2)
# True
isInstance(b, Test1)
# True

추가로 isInstance()는 튜플을 허용된다.

예시) unicode str 검사 방법 둘다 basestring 의 subclass임을 이용하는 방법

tmpStr = 'hello'
isInstance(tmpStr, (str, unicode))

무엇을 사용해야 하는가?

type()과 isInstance() 각각 특징이 있는 것이지 장단점이 있는 것이 아니기 때문에 적절히 활용하는 것이 좋다. 두 메서드를 적절히 사용하여 subclass를 확인 하는 방법도 있기 때문이다.

참조 자료

스택오브플러워

해시코드

반응형

+ Recent posts