반응형
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 |