Dưới đây là các mánh debug code Python phổ biến và hiệu quả:
Sử dụng print()
thông minh:
- In giá trị của biến tại các điểm quan trọng trong code để kiểm tra luồng dữ liệu.
- Thêm thông tin ngữ cảnh, ví dụ:
print(f"Biến x tại dòng 10: {x}")
. - Dùng
pprint
từ modulepprint
để in cấu trúc dữ liệu phức tạp (list, dict) rõ ràng hơn.
Dùng assert
để kiểm tra giả định:
- Thêm câu lệnh
assert điều_kiện, "thông báo lỗi"
để kiểm tra các điều kiện phải đúng. - Ví dụ:
assert len(my_list) > 0, "Danh sách rỗng!"
.
Sử dụng debugger tích hợp (PDB):
- Thêm
import pdb; pdb.set_trace()
tại điểm muốn debug để tạm dừng chương trình. - Dùng các lệnh như
n
(next),s
(step),c
(continue),p biến
(in giá trị biến). - Python 3.7+ hỗ trợ
breakpoint()
thay chopdb.set_trace()
.
Dùng IDE với debugger:
- Các IDE như PyCharm, VS Code, hoặc Jupyter Notebook có giao diện debug trực quan.
- Đặt breakpoint, theo dõi giá trị biến, và kiểm tra stack trace dễ dàng.
Kiểm tra lỗi với try-except
:
- Bọc code nghi vấn trong
try-except
để bắt và in thông tin lỗi chi tiết. - Ví dụ:
python try: result = risky_operation() except Exception as e: print(f"Lỗi: {e}")
Sử dụng logging thay vì print:
- Dùng module
logging
để ghi log với các mức độ (DEBUG, INFO, WARNING, ERROR). - Ví dụ:
python import logging logging.basicConfig(level=logging.DEBUG) logging.debug("Giá trị biến x: %s", x)
Kiểm tra kiểu dữ liệu và giá trị:
- Dùng
type(biến)
vàisinstance(biến, Kiểu)
để kiểm tra kiểu dữ liệu. - Dùng
id(biến)
để kiểm tra xem hai biến có trỏ cùng một đối tượng không.
Sử dụng công cụ linting:
- Dùng
flake8
,pylint
, hoặcmypy
để phát hiện lỗi cú pháp, lỗi logic tiềm ẩn, hoặc vấn đề về kiểu dữ liệu trước khi chạy.
Kiểm tra code từng phần:
- Tách code thành các hàm nhỏ, dễ kiểm tra.
- Dùng unit test (module
unittest
hoặcpytest
) để kiểm tra từng hàm riêng lẻ.
Sử dụng công cụ debug bên ngoài:
– PySnooper: Thêm decorator @pysnooper.snoop()
để tự động log toàn bộ giá trị biến trong hàm.
– ipdb: Phiên bản nâng cấp của pdb
, cài bằng pip install ipdb
.
– tracemalloc: Theo dõi bộ nhớ, hữu ích khi tìm memory leak.
Kiểm tra lỗi phổ biến:
– Index out of range: Kiểm tra độ dài danh sách/tuple trước khi truy cập.
– KeyError: Dùng dict.get(key, default)
để tránh lỗi key không tồn tại.
– TypeError: Đảm bảo kiểu dữ liệu phù hợp trước khi thực hiện phép toán.
Dùng REPL hoặc Jupyter Notebook:
– Thử nghiệm đoạn code nhỏ trong Python REPL hoặc Jupyter để kiểm tra nhanh logic.
Mẹo bổ sung:
- Đọc kỹ thông báo lỗi (traceback) để xác định dòng và loại lỗi.
- Tìm kiếm thông báo lỗi trên Google hoặc Stack Overflow, nhưng kiểm chứng trước khi áp dụng.
- Viết code đơn giản, rõ ràng để giảm thiểu lỗi từ đầu.