mypy là chưa đủ, cần phải nghiêm khắc hơn
by Pymier0
mypy là công cụ không thể thiếu khi code Python ở thập niên thứ 2 thế kỷ 21. mypy giúp phát hiện hàng loạt lỗi liên quan đến type, mang tới sức mạnh của static typing language tới Python. Nhưng đôi khi, là chưa đủ.
Thử sức xem bạn có phát hiện ra lỗi trong đoạn code này? Tác giả muốn bật DEBUG (django) khi dev trên MacOS:
import platform
if platform.system == "Darwin":
DEBUG = True
if platform.system + "Darwin":
DEBUG = True
mypy phát hiện ra lỗi khi thực hiện phép +
ở câu if
thứ hai
$ mypy testtype.py
testtype.py:6: error: Unsupported left operand type for + ("Callable[[], str]")
Found 1 error in 1 file (checked 1 source file)
nhưng không phát hiện ra vấn đề ở câu if
thứ nhất, vì đó là việc làm hoàn toàn hợp lệ trong Python: so sánh hai giá trị khác kiểu.
Tác giả viết thiếu dấu ()
, code sau khi cào đầu bứt tóc:
import platform
if platform.system() == "Darwin":
DEBUG = True
Thực chất, mypy cũng có thể phát hiện ra vấn đề này, nhưng phải thêm option strict:
$ mypy --strict testtype.py
testtype.py:3: error: Non-overlapping equality check (left operand type: "Callable[[], str]", right operand type: "Literal['Darwin']")
testtype.py:6: error: Unsupported left operand type for + ("Callable[[], str]")
Found 2 errors in 1 file (checked 1 source file)
Kết luận
Bật —strict lên.
Bài viết thực hiện với
$ python3 --version
Python 3.8.10
$ mypy --version
mypy 0.942
Hết.
Đăng ký ngay tại PyMI.vn để học Python tại Hà Nội TP HCM (Sài Gòn), trở thành lập trình viên #python chuyên nghiệp ngay sau khóa học.