TypedDict được giới thiệu trong PEP-589 và được đưa vào Python 3.8. Chủ yếu dùng để tạo chú thích kiểu cho từ điển.
- Thay vì dùng
dataclass hay pydantic để biểu diễn dữ liệu kiểu “record”, TypedDict tận dụng tính linh hoạt của từ điển nên có lợi trong những tình huống một số trường có thể bị thiếu.
- Ví dụ, định nghĩa lớp
Movie và gán cho biến movie một từ điển có kiểu Movie
class Movie(TypedDict):
title: str
movie: Movie = {"title": "Avatar"}
Non-totality
TypedDict hỗ trợ non-totality, tức khái niệm cho biết một số trường có thể bị thiếu. Điều này hữu ích khi triển khai endpoint HTTP PATCH
dataclass không có khái niệm trường bị thiếu nên có thể trở nên gượng ép
- Trong
TypedDict, có thể xử lý linh hoạt các trường bị thiếu bằng cách đặt total=False
- PEP-655 cho phép đánh dấu từng trường riêng lẻ bằng
Required và NotRequired
Dùng TypedDict với **kwargs
- PEP-692 cho phép dùng
TypedDict để khai báo đầu vào cho đối số từ khóa biến đổi
- Dùng
TypedDict có thể khiến mã trông dài dòng hơn, nhưng rất hữu ích khi tái sử dụng trong nhiều định nghĩa hàm
- Khi dùng cùng non-totality, nó càng phát huy thế mạnh
- Chẳng hạn như kịch bản tùy biến
pytest.fixture rồi chuyển tiếp nguyên một phần đối số
- Có thể mô phỏng hành vi tương tự bằng giá trị sentinel, nhưng chú thích kiểu có thể trở nên gượng gạo
Dùng TypedDict cho dependency injection
- PEP-692 cho phép kiểm tra kiểu khi gọi hàm bằng
TypedDict
- Hữu ích trong các tình huống nhiều tài nguyên cùng chia sẻ một phần dependency
- Định nghĩa một
TypedDict tương tự như việc gộp kwargs của mọi tài nguyên
- Sau đó viết lại để tài nguyên có thể nhận đối số tùy ý rồi dùng
TypedDict cho dependency injection
- Thông qua hệ thống kiểu, có thể kiểm tra lỗi hoặc thiếu đối số khi dependency injection
- Việc thay đổi signature của resource không phải là lý tưởng, nhưng vẫn là thay đổi nhỏ hơn so với framework dependency injection
- Nhiều framework không hỗ trợ kiểm tra kiểu tĩnh
Tính năng trong tương lai
- PEP-728 sẽ cho phép định nghĩa kiểu của các mục bổ sung, đồng thời định nghĩa từ điển đóng không cho phép thêm mục
- Giúp định nghĩa kiểu record chính xác hơn
- PEP-705 sẽ cho phép chỉ định mục chỉ đọc (tùy thời điểm công bố mà có thể đã được phát hành)
- Xử lý những tình huống có thể phát sinh vấn đề do biến đổi tiềm ẩn như xóa giữa các
TypedDict khác nhau lẽ ra phải tương thích một cách trực quan
Tóm tắt của GN⁺
TypedDict tận dụng tính linh hoạt của từ điển nên có lợi trong những tình huống một số trường có thể bị thiếu.
TypedDict cung cấp một lựa chọn linh hoạt hơn so với các cấu trúc dữ liệu khác như dataclass hay pydantic.
- Hãy chọn công cụ phù hợp với từng miền bài toán, nhưng cũng nên ghi nhớ các ưu điểm của
TypedDict
2 bình luận
Nếu dữ liệu thường xuyên đến từ bên ngoài ở dạng JSON hoặc hay được export ra ngoài Python, thì nên dùng
TypedDict; còn nếu không, tôi khuyên nên dùngdataclasshoặcNamedTuplecó cấu trúc rõ ràng.Ý kiến trên Hacker News
Những người thích kiểu động đang dần nhận ra tầm quan trọng của hệ thống kiểu
Lý do dùng
dataclass(slots=True)thay choTypedDict.foobarthay vì["foobar"]nên đỡ mỏi cổ tay hơnNếu không có hệ thống ép buộc kiểu,
TypedDictkhông có vai trò gì cảPydanticTiêu đề "thank you think" nghe quá thô lỗ
Trong câu liên quan đến đăng ký, ý nghĩa của "None" không rõ ràng
Trải nghiệm cá nhân với
TypedDictTypedDictđể chú thích các dict nhằm tăng độ dễ đọc của mãTính năng của
TypedDictthì tốt nhưng cú pháp khai báo khá rườm rà