Building Robust Codebases with Python's Type Annotations

Bài tóm tắt Hudson River Trading 2024 4. Điều chỉnh Độ khó: Dễ

Hudson River Trading · 2024 · 4. Điều chỉnh · Độ khó: Dễ — bài gốc

Phần lớn bài là hướng dẫn type annotation; wiki giữ phần lý do và cách HRT dùng nó.

Bối cảnh

  • Hàng triệu dòng Python của hàng trăm developer trong khoảng mười năm; giao dịch ở hơn 200 thị trường nên code phải đổi thường xuyên theo luật.
  • Lớp ngoài (CLI, GUI, process kích hoạt theo sự kiện cho trader, kỹ sư, vận hành) dựa trên lớp trong là logic nghiệp vụ dùng chung, một nguồn sự thật duy nhất. Ví dụ "ngày làm việc kế tiếp của NASDAQ là ngày nào" cần tra một DB lịch thị trường phải bảo trì liên tục.
  • Đổi một chút logic dùng chung có thể ảnh hưởng nhiều hệ; kiểm tay thì chậm và dễ sai, tài liệu không tự đồng bộ với code, test chỉ phủ kịch bản đã viết.

Thay đổi chính

  • Dùng mypy: khi đổi logic dùng chung thì đổi type annotation, type checker chỉ ra mọi hệ phía dưới bị ảnh hưởng (ví dụ hàm trả int đổi thành int | None làm lộ mọi chỗ gọi chưa xử lý None).
  • Kinh nghiệm: annotate lớp trong trước lớp ngoài; annotate tham số và giá trị trả về, để mypy suy luận biến bên trong; dữ liệu từ API ngoài thì TypedDict không đủ, vẫn phải kiểm schema lúc runtime; tránh dùng kiểu nguyên thuỷ cho khái niệm miền (CUSIP) mà dùng dataclass có kiểm tra hoặc NewType + TypeGuard; Literal như enum nhẹ.
  • Thêm type dần dần, không cần làm hết một lần. Đang thử thêm generative testing bằng Hypothesis.

Vì sao

  • Type annotation là tài liệu được máy kiểm và đồng bộ với code, bổ sung cho test ở chỗ test không phủ (cách dùng mới của logic dùng chung).

Bài học cho SWE

  • Trong codebase lớn, giá trị chính của type checker là phân tích ảnh hưởng khi đổi API dùng chung.
  • Đặt type ở lớp lõi được dùng nhiều nhất trước.

Liên quan