zenn.skin 무료버전 배포중!
자세히보기

Python/Syntax

[Python] Dictionary 대신 사용할 수 있는 NamedTuple (NamedTuple Type Annotation)

koosco! 2022. 9. 10. 04:19

C나 C++, Java는 함수나 클래스를 이용할 때, 파라미터의 타입이나 출력값의 타입 등을 지정해줄 수 있습니다.

타입을 미리 지정하면 오류를 줄이거나 발견하기 쉽고, 코드의 가독성을 좀 더 올릴 수 있는 장점이 있습니다.

python에서도 typing 모듈을 이용한 type annotation을 지원해줍니다. 오늘은 그 중에서도 Named Tuple에 대해 알아보려 합니다.

 

1. 딕셔너리(Dict)

person = {'height': 180,
        'weight': 75,
        'name': 'koo'}

데이터를 표현할 때 딕셔너리 자료형을 사용하면, 데이터의 속성을 나타낼 수 있습니다.

딕셔너리 자료형에는 몇가지 문제가 있습니다.

  • 약간의 오버헤드가 있는 비효율적인 표현 방식이기 때문에 필요 이상의 메모리를 차지
  • 딕셔너리의 key에 접근할 때, 오타가 발생한다면 새로운 속성이 생기거나 다른 값이 변경
  • 다양한 타입으로 구성된 딕셔너리의 경우, 타입 어노테이션을 사용에 한계 존재

 

2. namedtuple

collections에 있는 namedtuple은 tuple과 비슷하지만 key-value 관계를 갖도록 데이터를 생성할 수 있습니다.

from collections import namedtuple

personinfo = namedtuple('person', ['height', 'weight', 'name'])
person = personinfo(180, 75, 'koo')

print(person.height)
print(person.name)

namedtuple을 사용하면 딕셔너리처럼 Dict['key name']을 사용하는 것이 아닌 " . "을 사용해 속성에 접근하는 것처럼 사용합니다.

 

3. Type Annotation

from typing import NamedTuple

class PersonInfo(NamedTuple):
    height: float
    weight: float
    name: str
    
person = PersonInfo(180, 75, 'koo')


print(person.height)
print(person.name)

typing에 있는 NamedTuple을 사용하면 타입 어노테이션을 사용할 수 있습니다.

새로운 클래스를 NamedTuple을 상속받아 만들고, 인스턴스를 만들어 데이터를 사용할 수 있습니다.

NamedTuple을 사용하면 에디터를 사용해 속성에 접근할 수 있고, 앞서 딕셔너리에서 언급한 단점들을 보완할 수 있는 장점이 있습니다.

하지만 NamedTuple은 Tuple과 같이 생성되면 값을 수정할 수 없습니다. 그렇기 때문에 값의 변화가 없는 데이터를 표현할 때 유용하게 사용할 수 있을 것 같습니다.

 

person.height = 181

한 번 설정된 값은 수정할 수 없음

'Python/Syntax'의 다른글

  • 현재글 [Python] Dictionary 대신 사용할 수 있는 NamedTuple (NamedTuple Type Annotation)

관련글