더북(TheBook)
grades = []
grades.append((95, 0.45, "참 잘했어요"))
grades.append((85, 0.55, "다음엔 더 잘할 수 있어요"))
total = sum(score * weight for score, weight, _ in grades)
total_weight = sum(weight for _, weight, _ in grades)
average_grade = total / total_weight

이런 식으로 튜플을 점점 더 길게 확장하는 패턴은 딕셔너리를 여러 단계로 내포시키는 경우와 유사하다. 원소가 3개 이상인 튜플을 사용한다면 다른 접근 방법을 생각해봐야 한다. 내장 모듈인 dataclasses가 이럴 때 정확히 필요한 기능을 제공한다. dataclasses를 사용하면 애트리뷰트에 값을 저장하는 작은 불변 클래스를 쉽게 정의할 수 있다(아이템 56 “불변 객체를 생성할 때는 dataclasses를 선호하라” 참조).

from dataclasses import dataclass

@dataclass(frozen=True)
class Grade:
    score: int
    weight: float