Python 3.8의 TypedDicts는 생각보다 꽤 좋음
(blog.changs.co.uk)TypedDict는 PEP-589에서 소개되었으며, Python 3.8에 도입되었음. 주로 딕셔너리의 타입 주석을 생성하는 데 사용됨.dataclass나pydantic을 사용하여 '레코드' 타입 데이터를 표현하는 대신,TypedDict는 딕셔너리의 유연성을 활용하여 필드가 누락될 수 있는 상황에서 유리함.- 예를 들어,
Movie클래스를 정의하고movie변수에Movie타입의 사전을 할당하는 방식
class Movie(TypedDict):
title: str
movie: Movie = {"title": "Avatar"}
Non-totality
TypedDict은 필드가 누락될 수 있음을 나타내는 개념인 non-totality를 지원. HTTP PATCH 엔드포인트 구현 시 유용dataclass는 필드 누락 개념이 없어 어색할 수 있음TypedDict에서는total=False로 설정하여 유연하게 필드 누락을 처리 가능- PEP-655에서는
Required와NotRequired로 개별 필드 표시 가능
TypedDict를 **kwargs로 사용
- PEP-692는
TypedDict를 사용하여 가변 키워드 인수를 입력할 수 있게 함 TypedDict를 사용하면 코드가 장황해 보일 수 있으나, 여러 함수 정의에서 재사용 시 유용- Non-totality와 함께 사용하면 더욱 강점 발휘
pytest.fixture를 커스텀하면서 일부 인수를 그대로 전달하는 시나리오 등
- Sentinel 값으로 유사한 동작 구현 가능하나 타입 어노테이션이 어색해질 수 있음
의존성 주입에 TypedDict 사용
- PEP-692는
TypedDict를 사용한 함수 호출 시 타입 검사 가능하게 함 - 많은 리소스가 일부 의존성을 공유하는 상황에서 유용
- 모든 리소스의 kwargs를 합친 것과 유사한
TypedDict를 정의 - 리소스가 임의의 인수를 받도록 재작성한 후
TypedDict로 의존성 주입 - 타입 시스템을 통해 의존성 주입 시 인수 오류나 누락 검사 가능
- 리소스 시그니처 변경은 이상적이지 않으나 의존성 주입 프레임워크보다는 작은 변화
- 정적 타입 검사를 지원하지 않는 프레임워크가 많음
향후 기능
- PEP-728은 추가 항목의 타입을 정의하고, 추가 항목을 허용하지 않는 닫힌 사전 정의 가능하게 함
- 레코드 타입을 더 정확하게 정의하는 데 도움
- PEP-705는 읽기 전용 항목 지정 가능하게 함 (발표 시점에 따라 이미 출시되었을 수 있음)
- 직관적으로 호환되어야 하는 다른
TypedDict간에 잠재적 변이(삭제)로 인한 문제 발생 가능한 상황 대응
- 직관적으로 호환되어야 하는 다른
GN⁺의 정리
TypedDict는 딕셔너리의 유연성을 활용하여 필드가 누락될 수 있는 상황에서 유리함.TypedDict는dataclass나pydantic과 같은 다른 데이터 구조보다 더 유연한 옵션을 제공함.- 도메인에 따라 적합한 도구를 선택하되,
TypedDict의 장점도 염두에 둘 것
- 도메인에 따라 적합한 도구를 선택하되,
댓글과 토론
데이터가 외부에서 json 형태로 오거나 파이썬 외부로 export하는 일이 잦은 경우에는 TypedDict를 사용하면 좋고, 그게 아니라면 구조화된 dataclass나 NamedTuple을 사용하는 것을 추천합니다.
Hacker News 의견
-
동적 타입을 선호하는 사람들이 점점 타입 시스템의 중요성을 깨닫고 있음
- 더 나은 타입 시스템이 더 나쁜 타입 시스템보다 우수함
-
dataclass(slots=True)를TypedDict대신 사용하는 이유- 속성 접근이 더 빨라 코드가 더 빠름
- 슬롯 클래스는 더 적은 RAM을 사용하고, L1 캐시 압박이 적어 코드가 더 빠름
- 속성 접근 시
["foobar"]대신.foobar를 사용해 손목에 부담이 덜함 - 속성 이름을 잘못 입력하면 런타임 오류 발생
-
타입을 강제하는 시스템이 없다면
TypedDict는 아무런 역할을 하지 않음- 문자열로 주석된 속성에 실수를 저장해도 기본 Python은 이를 막거나 경고하지 않음
- 타입을 실제로 강제하려면
Pydantic같은 도구를 사용해야 함
-
"thank you think"라는 제목은 지나치게 무례하게 들림
- "than i thought"가 더 읽기 좋음
-
구독 관련 문장에서 "None"의 의미가 불명확함
- 문법이 복잡해 이해하기 어려움
-
TypedDict에 대한 개인적인 경험
- 코드의 가독성을 높이기 위해
TypedDict를 사용해 dicts를 주석 처리함 - 코드 경로를 추적하는 시간을 줄일 수 있었음
- 더 나은 코딩 실력이 필요하지만, dict를 많이 사용하는 앱에서는 좋은 해결책임
- 코드의 가독성을 높이기 위해
-
TypedDict의 기능은 좋지만 선언 구문이 복잡함