Programming/Python

[Python] 네임드튜플 (namedtuple)

sahayana 2022. 4. 19. 21:47


#1.  namedtuple

네임드튜플(namedtuple)은 튜플 자료형 요소를 이름(label)으로 색인할 수 있는 파이썬 자료형 중 하나입니다.
말 그대로 '이름 있는 튜플'이라고 보면 됩니다.

기존의 튜플(tuple) 자료형 요소의 탐색은 리스트와 마찬가지로 tuple[1], tuple[2] 등의 인덱스로 찾습니다.
그러나 namedtuple의 경우 마치 dict 자료형 처럼 tuple.field1, tuple.field2 등 정해진 label(field)명으로 탐색이 가능합니다.

namedtuple은 python collections 모듈의 하위 메서드 입니다.


#2.  namedtuple 예시


import collections

Fruit = collections.namedtuple('Fruit', ['name', 'price'])


네임드튜플은 collections 모듈을 통해 불러와 위와 같이 정의가 가능합니다.

'Fruit' 은 type_name, ['name', 'price']는 field_name 즉, label 입니다.

 

field_name을 정의하는 방법에는 리스트 뿐만아니라 다음과 같은 방법도 가능합니다.

import collections


# 리스트
Fruit = collections.namedtuple('Fruit', ['name', 'price'])
# 콤마
Fruit = collections.namedtuple('Fruit', 'name, price')
# 스페이스
Fruit = collections.namedtuple('Fruit', 'name price')

네임드튜플 객체는 다음과 같이 생성합니다.

fruit1 = Fruit('grape', '5000')
fruit2 = Fruit('orange', '4000')
fruit3 = Fruit('apple', '1000')

생성한 네임드튜플 객체는 class를 반환합니다.
또한 라벨과 인덱스로 탐색이 가능합니다.

>>> fruit1 = Fruit('grape', '5000') 
>>> fruit1
Fruit(name='grape', price='5000')
>>> fruit1.name
'grape'
>>> fruit1.price
'5000'
>>> fruit1[0]
'grape'
>>> fruit1[1]
'5000'
>>> type(fruit1)
<class '__main__.Fruit'>

#3.  namedtuple과 class의 차이

 

namedtuple은 class를 반환하지만 결국 tuple과 같은 immutable한 자료형이기 때문에 속성의 탐색만 가능할 뿐 생성한 객체를 통해 새로운 속성을 추가하거나 변경할 수 없습니다.

>>> fruit1.color = 'green' 
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: 'Fruit' object has no attribute 'color'

#4. 정리


  • namedtuple은 collections 모듈의 하위 메서드로 field_name으로 요소 탐색이 가능하다.

  • class를 반환하지만 결국 tuple처럼 immutable하기 때문에 속성의 추가나 변경은 할 수 없다.

  • 속성의 변화가 필요없다면 class의 대안이 될 수 있다.