5 điểm bởi GN⁺ 2024-10-14 | 2 bình luận | Chia sẻ qua WhatsApp
  • 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 RequiredNotRequired

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

 
ilotoki0804 2024-10-15

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ùng dataclass hoặc NamedTuple có cấu trúc rõ ràng.

 
GN⁺ 2024-10-14
Ý 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

    • Hệ thống kiểu tốt hơn thì ưu việt hơn hệ thống kiểu kém hơn
  • Lý do dùng dataclass(slots=True) thay cho TypedDict

    • Truy cập thuộc tính nhanh hơn nên mã chạy nhanh hơn
    • Lớp dùng slot tiêu tốn ít RAM hơn và gây ít áp lực lên bộ nhớ đệm L1 hơn, nên mã chạy nhanh hơn
    • Khi truy cập thuộc tính, dùng .foobar thay vì ["foobar"] nên đỡ mỏi cổ tay hơn
    • Nếu gõ sai tên thuộc tính thì sẽ phát sinh lỗi lúc chạy
  • Nếu không có hệ thống ép buộc kiểu, TypedDict không có vai trò gì cả

    • Dù có lưu nhầm một giá trị vào thuộc tính được chú thích là chuỗi, Python mặc định cũng không chặn hay cảnh báo điều đó
    • Muốn thực sự ép kiểu thì phải dùng công cụ như Pydantic
  • Tiêu đề "thank you think" nghe quá thô lỗ

    • "than i thought" đọc sẽ tự nhiên hơn
  • Trong câu liên quan đến đăng ký, ý nghĩa của "None" không rõ ràng

    • Ngữ pháp phức tạp nên khó hiểu
  • Trải nghiệm cá nhân với TypedDict

    • Dùng TypedDict để chú thích các dict nhằm tăng độ dễ đọc của mã
    • Có thể giảm thời gian phải lần theo các đường đi của mã
    • Dù cần kỹ năng lập trình tốt hơn, đây vẫn là giải pháp hay trong các ứng dụng dùng nhiều dict
  • Tính năng của TypedDict thì tốt nhưng cú pháp khai báo khá rườm rà