본문 바로가기
python

python - 타입 비교, 이런방식도 있었어?

by 맑은안개 2020. 3. 24.

Built-in function인 type, isinstance 함수를 사용하여 오브젝트 타입을 비교하고 마지막에는 Built-in library인 types를 사용하여 타입 비교하는 방법을 살펴본다.

 

변수 타입 확인

_string = 's'
_int = 10
_float = 25.6
_list = [_string, _int, _float]

print('_string type: {}, _int type: {}, _float type {}, _list type {}'
.format(type(_string), type(_int), type(_float), type(_list)))

OUTPUT

_string type: <class 'str'>, _int type: <class 'int'>, _float type <class 'float'>, _list type <class 'list'>

 

type() 은 Python 에서 제공하는 Built-in function으로 오브젝트 타입을 확인 할 수 있다.

print(type(_string) == type('')) # True
print(type(_int) == type(1)) # True
print(type(_float) == type(0.1)) # True
print(type(_list) == type([])) # True

 

Dictionary 타입도 위와 마찬가지로 type을 이용해 비교한다.

>>> _dict = {'a':'1'}
>>> type(_dict) == type({})
True

 

__name__을 사용하여 타입명 출력

>>> age = 10
>>> type(age).__name__
'int'

 

None 은 무슨 타입일까?

None은 NoneType클래스 객체이다. 

>>> _None = None
>>> type(_None)
<class 'NoneType'>

None 확인은 == 또는 is 연산자를 사용하여 확인할 수 있다. 

>>> _None == None
True
>>> _None is None
True

 

isinstance(objectclassinfo) 사용하여 변수 오브젝트 유형비교

>>> print(isinstance(_string, str))
True
>>> _string = 10
>>> print(isinstance(_string, str))
False

>>> print(isinstance(_int, int)) 
True
>>> print(isinstance(_float, int))
False
>>> print(isinstance(_float, float))
True
>>> print(isinstance(_list, list))
True

_dict = {'a', '1'}
>>> isinstance(_dict, dict)
True

 

Python 공식 레퍼런스에서는 서브클래스 비교를 고려하여 isinstance 를 사용할 것을 권장한다.

 

The isinstance() built-in function is recommended for testing the type
of an object, because it takes subclasses into account.

 

서브클래스 비교 예시를 위해 새(Bird) 클래스를 상속받는 독수리(Eagle) 클래스를 만들고 instance 유형을 비교한다.

class Bird(object):
  canFly:True

class Eagle(Bird):pass

e = Eagle()

print(isinstance(e, Eagle)) # True -- e는 Eagle클래스를 구현한 Instance
print(isinstance(e, Bird)) # True -- e는 Bird클래스를 상속받은 자식 Instance

b = Bird()

print(isinstance(b, Eagle)) # False -- b는 Eagle Instance가 아니다.
print(isinstance(b, Bird)) # True
print(isinstance(b, object)) # True -- b(Bird)는 object를 상속한 서브클래스이다.

 

Types클래스에 정의된 type예제

Types클래스는 기본 변수 타입을 제외한 다른 오브젝트 타입들을 상수로 제공한다. 

우리는 type을 사용하여 Function오브젝트를 다음과 같이 비교할 수 있다.

>>> def fun():pass

>>> type(fun)
<class 'function'>

>>> a = fun
>>> type(a) == type(fun)
True

위를 Types 클래스를 사용하여 표현하면 아래와 같다.

>>> import types

>>> types.FunctionType == type(a)
True

Types클래스의 내부 구현로직을 살펴보면 type을 사용하여 구성되어있다.

변수 타입 체크시 코드상에서 가독성 증대를 위해서 Types클래스 사용이 권장된다.

반응형