네임드튜플(namedtuple)

namedtuple이란 파이썬 자료형 중 하나로 튜플이지만 이름으로 그 값에 접근할 수 있게 해 주는 자료형이다.

먼저 다음과 같은 프로그램을 생각해 보자.

a = ("홍길동", 25, "Programmer")
b = ("김철수", 32, "Manager")
c = ("김영희", 41, "Designer")

for person in [a, b, c]:
    print("이름:%s" % person[0])
    print("나이:%s" % person[1])
    print("직업:%s" % person[2])

a, b, c라는 튜플을 순서대로 출력하는 프로그램이다. 각 튜플은 차례대로 이름, 나이, 직업을 요소로 갖는 튜플이다.

튜플의 요소에 접근하기 위해서는 인덱싱만이 가능하므로 좀 더 편리한 접근을 위해 다음과 같이 개선이 가능하다.

class Person:
    def __init__(self, name, age, job):
        self.name = name
        self.age = age
        self.job = job

a = Person(name="홍길동", age=25, job="Programmer")
b = Person(name="김철수", age=32, job="Manager")
c = Person(name="김영희", age=41, job="Designer")

for person in [a, b, c]:
    print("이름:%s" % person.name)
    print("나이:%s" % person.age)
    print("직업:%s" % person.job)

튜플 대신 Person이라는 클래스를 생성하면 위 예처럼 인덱싱이 아닌 이름으로 접근할 수 있게 된다.

이번에는 좀 더 편리한 namedtuple을 이용한 방법을 알아보도록 하자. namedtuple을 사용하면 다음과 같이 작성할 수 있다.

from collections import namedtuple

Person = namedtuple("Person", ["name", "age", "job"])

a = Person(name="홍길동", age=25, job="Programmer")
b = Person(name="김철수", age=32, job="Manager")
c = Person(name="김영희", age=41, job="Designer")

for person in [a, b, c]:
    print("이름:%s" % person.name)
    print("나이:%s" % person.age)
    print("직업:%s" % person.job)

namedtuple을 이용하면 Person 클래스를 따로 만들지 않아도 동일하게 동작하게 할 수 있다. 아주 간편한 모습이다.

namedtuple의 첫번째 입력항목은 namedtuple의 자료형의 명칭(type name)이다. 보통 namedtuple로 생성되는 객체명과 동일하게 한다. 뒤에 따라오는 리스트는 Person이라는 namedtuple의 변수로 사용될 항목들이 된다.

namedtuple은 이름 그대로 tuple이기 때문에 다음과 같이 인덱싱으로도 역시 접근이 가능하다.

for person in [a, b, c]:
    print("이름:%s" % person[0])
    print("나이:%s" % person[1])
    print("직업:%s" % person[2])

단, namedtuple은 요소값을 변경할 수 없는(immutable) 튜플의 성격을 갖기 때문에 그 값을 변경할 수는 없다. 따라서 다음과 같은 코드는 오류가 발생하게 된다.

>>> from collections import namedtuple
>>> Person = namedtuple("Person", ["name", "age", "job"])
>>> a = Person(name="홍길동", age=25, job="Programmer")
>>> a.name = "고길동"
Traceback (most recent call last):
  File "<stdin>", line 1, in <module>
AttributeError: can't set attribute

박응용 466

2020년 7월 8일 10:44 오후

목록으로