[Python] collections.namedtuple

Rudy·2022년 8월 8일
0

namedtuple

  • 키와 인덱스로 접근 가능한 튜플.
  • 기존의 tuple와 동일하게 immutable로 변경할 필요가 없는 데이터를 효과적으로 저장.
  • 기존의 tuple에 각 데이터에다가 label을 붙여서 사용할 수 있도록 만든 형태.
  • 객체를 만들 수 있는 클래스

사용방식

 namedtuple(typename, field_names, *, rename=False, defaults=None, module=None)

  • typename의 이름을 가진 새로운 튜플 서브 클래스를 반환.

  • field_names로 각 데이터의 위치에 대한 label을 지정할 수 있다. 이때 리스트 형태나 띄어쓰기 or 쉼표로 구분된 문자열이 사용 가능하다.

  • rename은 True시 field_name에 포함된 예약어, 중복된 이름을 자동으로 _1,_2, ... 형태로 변경한다. 아닐 시 오류발생.

  • default는 말 그대로 기본값을 정의. 오른쪽에 맞춰서 적용된다.

    field_name이 ['x', 'y', 'z'] 이고 default가 (2,3) 이면 x는 필수, y,z는 default로 2,3이 적용된다.

  • module은 해당 튜플의 __module__에 입력받은 값을 저장해준다. 해당 모듈에서 해당 namedtuple이 정의됨을 알려주기 위한 장치.

from collections import namedtuple

Grade = namedtuple('Grade', ['subject','grade'],defaults=['F'])
john = Grade('math',grade = 'A')
print(john[0],john[1])
#math A
#index로 접근 가능

somenamedtuple._make(iterable)

  • 기존의 iterable을 가지고 새로운 namedtuple 객체로 만드는 메소드
g = ('english','B')
doe = Grade._make(g)
print(doe.subject,doe.grade)
#english B
#key값으로도 접근 가능

somenamedtuple._asdict()

  • 필드 이름을 key로, 값은 value로 하는 dict를 반환
print(john._asdict())
#{'subject': 'math', 'grade': 'A'}

somenamedtuple._replace(**kwargs)

  • somenamedtuple에서의 값을 kwargs로 준 값으로 변경하여 새로만든 namedtuple을 반환
john = john._replace(grade='A+')
print(john[0],john[1])
#math A+

somenamedtuple._fields

  • 필드 이름을 나열한 tuple
print(Grade._fields)
#('subject', 'grade')

somenamedtuple._fields_defaults

  • default 값이 정의된 field를 key로, 해당 default 값을 value로 하는 dict
print(Grade._field_defaults)
#{'grade': 'F'}

기타

  • 클래스 객체이므로 getattr()을 통해 접근 가능
  • 딕셔너리를 namedtuple로 만들려면 ** 사용. 이때 key의 이름은 namedtuple의 field에 맞아야함.
  • 클래스이므로 해당 클래스를 상속받아 새로운 클래스를 정의하면서 추가적인 메소드를 추가할 수 있음. 단순히 새로운 필드를 추가하고 싶다면 새로운 namedtuple를 정의하는게 나음.
profile
부족해도 너무 부족하다

0개의 댓글