MyPy
MyPy là một trình kiểm tra kiểu tĩnh (static type checker) cho ngôn ngữ lập trình Python. Mặc dù Python là một ngôn ngữ động (dynamically typed), từ Python 3.5 trở đi, bạn có thể sử dụng type hints (chú thích kiểu) để khai báo kiểu biến, hàm, v.v. MyPy giúp bạn phân tích mã nguồn và phát hiện lỗi kiểu dữ liệu mà không cần phải chạy chương trình.
Mục tiêu chính của MyPy
-
Giúp phát hiện lỗi sớm trong quá trình phát triển.
-
Tăng tính an toàn của mã nguồn.
-
Cải thiện trải nghiệm lập trình, đặc biệt khi làm việc nhóm hoặc dự án lớn.
-
Kết hợp tốt với các công cụ IDE như VSCode, PyCharm.
Ví dụ đơn giản
def greet(name: str) -> str:
return "Hello, " + name
greet(123) # Sai kiểu, nhưng Python vẫn chạy được
Python sẽ không báo lỗi khi chạy, nhưng MyPy sẽ phát hiện:
error: Argument 1 to "greet" has incompatible type "int"; expected "str"
Cài đặt MyPy
pip install mypy
Cách sử dụng
def add(a: int, b: int) -> int:
return a + b
kiểm tra
mypy example.py
Thiết lập MyPy cho một dự án thực tế
Giả sử bạn có một dự án như sau:
my_project/
├── main.py
├── utils/
│ ├── __init__.py
│ └── math_tools.py
└── requirements.txt
Cài đặt MyPy
pip install mypy
Viết chú thích kiểu (type hints)
Ví dụ trong math_tools.py
:
# utils/math_tools.py
def multiply(a: int, b: int) -> int:
return a * b
def divide(a: float, b: float) -> float:
if b == 0:
raise ValueError("Cannot divide by zero")
return a / b
Và trong main.py
:
# main.py
from utils.math_tools import multiply, divide
result1 = multiply(4, 5)
result2 = divide(10.0, 2.0)
print("Multiply:", result1)
print("Divide:", result2)
Tạo file cấu hình mypy.ini
Tại gốc dự án, tạo file mypy.ini
[mypy]
python_version = 3.10
ignore_missing_imports = True
disallow_untyped_defs = True
check_untyped_defs = True
strict_optional = True
warn_unused_ignores = True
-
ignore_missing_imports = True
: Bỏ qua lỗi khi thiếu kiểu từ thư viện bên ngoài (ví dụ: thư viện không có type stub). -
disallow_untyped_defs = True
: Bắt buộc tất cả các hàm phải có chú thích kiểu. -
check_untyped_defs = True
: Kiểm tra cả hàm không có type hints. -
strict_optional = True
: Bật kiểm tra biến có thể làNone
.
Kiểm tra bằng MyPy
mypy .
Tích hợp vào quy trình CI hoặc pre-commit
Bạn có thể thêm vào CI/CD hoặc Git hook để đảm bảo mọi thay đổi đều được kiểm tra type:
Ví dụ dùng pre-commit hook:
# .pre-commit-config.yaml
- repo: https://github.com/pre-commit/mirrors-mypy
rev: v1.8.0 #rev viết tắt của revision, dùng để chỉ phiên bản (version) của repo của bạn
hooks:
- id: mypy
Tác giả: Đỗ Ngọc Tú
Công Ty Phần Mềm VHTSoft
Không có bình luận