namedtuple이란게 있다.
from collections import namedtuple mynamedtuple = namedtuple("mynamedtuple", ["field1", "field2"]) print mynamedtuple('field1', 2222)
이런식으로 쓰는데 저걸보고 든 생각이.. 굳이 저 namedtuple을 쓰는것보다 딕셔너리나, 복잡해지면 클래스로 간단하게 정의하면 되지 않을까? 생각해서 관련 글을 찾아봤었는데 좋은 글을 찾아서 번역한다.
의 첫번째 답에서 유용한 부분만 가져온다.
예로 아래와 같은 클래스를 만든다고 가정해봅시다.
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을 쓴다.
'Python > 2.7 information' 카테고리의 다른 글
json.loads 에러시 위치 찾는 방법 꿀팁 (2) | 2019.12.02 |
---|---|
dictionary 예쁘게 출력하기 + 한글 그대로 출력 (0) | 2019.10.23 |
timezone 설정 모듈. (0) | 2019.09.28 |
python re search with newline (0) | 2019.09.23 |
파일 옮기는 꿀팁. (SimpleHTTPServer) (0) | 2019.08.01 |