Python/2.7 information

why use namedtuple

qkqhxla1 2020. 12. 26. 23:32

namedtuple이란게 있다.

from collections import namedtuple

mynamedtuple = namedtuple("mynamedtuple", ["field1", "field2"])
print mynamedtuple('field1', 2222)

이런식으로 쓰는데 저걸보고 든 생각이.. 굳이 저 namedtuple을 쓰는것보다 딕셔너리나, 복잡해지면 클래스로 간단하게 정의하면 되지 않을까? 생각해서 관련 글을 찾아봤었는데 좋은 글을 찾아서 번역한다.


https://stackoverflow.com/questions/9872255/when-and-why-should-i-use-a-namedtuple-instead-of-a-dictionary


의 첫번째 답에서 유용한 부분만 가져온다.


예로 아래와 같은 클래스를 만든다고 가정해봅시다.

class Container:
    def __init__(self, name, date, foo, bar):
        self.name = name
        self.date = date
        self.foo = foo
        self.bar = bar

mycontainer = Container(name, date, foo, bar)

그런데 내부의 attribute들을 바꾸지 않고 namedtuple로는 아래처럼 간단하게 만들어서 쓸수 있습니다.

Container = namedtuple('Container', ['name', 'date', 'foo', 'bar'])

mycontainer = Container(name, date, foo, bar)

물론 딕셔너리를 사용해서 각각의 key를 갖도록 해서 만들수도 있습니다. 그런데 아래와 같은 상황을 가정해봅시다.

만약 key로 오직 유효한 구분자(id)들만 사용하고 key들은 변하지 않는다고 가정해봅시다


mynametuple.fieldname이 mydict['fieldname']보다 더 직관적입니다. -> 개인적으로 이 말이 namedtuple과 dictionary를 가르는 중요한 말이라고 생각하는데 왜 mynametuple.fieldname이 mydict['fieldname']보다 직관적으로 보이냐면 mydict은 딕셔너리이므로 키가 바뀔수 있다는 인식이 있는 반면 mynametuple.fieldname처럼 쓰면 클래스의 private한 변수를 참조하는것처럼 보여서 키가 바뀌지 않는것처럼 보이죠. 이 뜻인것 같습니다. 저도 아직 애매한데 좋은 의견 있으면 적어주시길.


그리고 mynametuple = MyNamedTuple(firstvalue, secondvalue)가

mydict = {'fieldname': firstvalue, 'secondvalue': secondvalue}보다 더 직관적입니다. -> 이 뜻도 위와 동일한것 같습니다. 조금더 보기에 필드명이 변할것같지 않다..


또 namedtuple은 딕셔너리와 다르게 들어간 순서대로 값이 저장되어집니다. -> 라고 스택오버플로우에 써있는데 제가 알기로 파이썬 3.7인가부터는 딕셔너리도 순서가 유지됩니다.



결론.

간단한 '키:값'형태의 자료구조를 만들어야 하는데 클래스는 너무 큰,과한 느낌이라 조금 간단하게 만들때, 키값이 스트링이고 변하지 않으며 그것을 코드에서 다른 사람이 읽었을때 키값이 immutable이라는 가독성을 더 주기 위해서는 namedtuple을 쓴다.