Cú pháp dưới cho Python ≥ 3.12 và Pydantic 2.x (đã chạy thử với Python 3.12, Pydantic 2.14, mypy --strict). Bảng đổi tên API v1 → v2 xem ở FastAPI cơ bản; cấu hình mypy xem ruff và mypy.
from typing import NotRequired, Protocol, TypedDict, runtime_checkableclass Iface(TypedDict): # dict có key cố định, ví dụ JSON từ API name: str mtu: int descr: NotRequired[str] # key có thể vắng@runtime_checkableclass Driver(Protocol): # "duck typing" có kiểm tra: class nào có get_facts() là hợp lệ def get_facts(self) -> dict[str, str]: ...def collect(drv: Driver) -> dict[str, str]: return drv.get_facts()
Dùng
Khi
TypedDict
Dữ liệu vẫn là dict (JSON, kết quả thư viện), chỉ cần type checker hiểu key
dataclass
Object nội bộ, không cần validate input
Pydantic BaseModel
Input không tin cậy: API, file YAML, env; cần validate và ép kiểu
from pydantic import ValidationErrortry: Device(hostname="x", platform="eos", mgmt_ip="1.2.3", ssh_port=0)except ValidationError as e: for err in e.errors(): # 3 lỗi được gom trong một lần print(err["loc"], err["type"], err["msg"])# ('platform',) literal_error ...# ('mgmt_ip',) ip_v4_address ...# ('ssh_port',) value_error ...
Mặc định Pydantic chạy lax mode: "9000" thành 9000, "true" thành True. Điều này tiện khi đọc YAML/env, nhưng nếu cần bắt lỗi kiểu chặt (vd input từ API công khai) thì bật strict=True cho model hoặc từng field Field(strict=True).
mypy báo Decorators on top of @property are not supported ở @computed_field: đây là hạn chế đã biết, thêm # type: ignore[prop-decorator] như ví dụ trên.