본문 바로가기

Computer/Python

namedtuple 인스턴스 확인

반응형

collections 내장모듈의 namedtuple은 tuple의 불변성과 클래스의 속성접근 특성을 합친 많이 쓰이는 파이썬의 자료구조입니다. 다음과 같이 issubclass 내장함수를 사용하면 namedtuple로 선언한 클래스가 tuple의 자식클래스임을 알 수 있습니다.

>>> Point = namedtuple('Point', ['x' 'y'])
>>> pt = Point([1,2])
>>> issubclass(Point, tuple)
True

그렇다면 우리가 다루는 인스턴스가 namedtuple 자료구조로부터 왔는지 어떻게 확인할 수 있을까요? 먼저 type 함수를 통해 pt 인스턴스의 타입을 살펴보면 namedtuple로 선언한 클래스 이름이 나옵니다. 하지만 우리는 클래스 이름을 모르는 상황을 가정해보겠습니다.

>>> type(pt)
<class '__main__.Point'>

인스턴스가 어떠한 클래스의 인스턴스인지 확인하려면 isinstance 내장함수를 사용하면 됩니다. 하지만 namedtuple은 tuple이기는 하지만 단순히 "isinstance(our_instance, tuple)"을 수행한다면 namedtuple만이 아닌 일반 tuple까지 True를 리턴합니다. 그렇다면 namedtuple만이 가지고 있는 고유한 attribute를 사용해서 해결할 수 있지 않을까요?

지난 namedtuple 포스트를 보면 namedtuple은 생성시 "_asdict"와 "_fields"라는 attribute를 가지고 있습니다. 이 사실과 hasattr 내장함수를 사용하면 다음과 같이 namedtuple 인스턴스 여부를 확인할 수 있습니다.

def namedtuple_instance(ins) -> bool:    
    return (isinstance(ins, tuple) and 
            hasattr(ins, '_asdict') and
            hasattr(ins, '_fields'))

>> namedtuple_instance(pt)
True

>>> a = (1,2)
>>> namedtuple_instance(a)
False
반응형

'Computer > Python' 카테고리의 다른 글

파이썬의 GIL 사용 이유  (2) 2021.07.24
Decorator 에서 함수 디폴트 인자 파악 방법  (0) 2021.07.20
파이썬의 memory management  (3) 2021.07.14
파이썬과 객체  (0) 2021.07.14
파이썬의 Namespace와 Scope  (0) 2021.07.13