Linting tool là một tài nguyên quý giá, có thể giúp bạn bắt lỗi và sự không nhất quán trong code. Flake8 là một trong số công cụ linting phổ biến nhất cho Python.
Flake8 xác định các lỗi cú pháp và định dạng trong code, cùng với các lỗi khác như import không sử dụng. Nó rất linh hoạt dù có các quy tắc mặc định nhưng bạn vẫn có thể thay đổi chúng hoặc thêm chúng phù hợp với yêu cầu.
Bạn cũng có thể cấu hình Flake8 chạy khi lưu các bản cập nhật code bằng VS Code. Tất cả những tính năng này đã khiến nó trở thành một công cụ đáng giá khi viết các chương trình bằng Python.
Cài đặt Flake8
Hãy làm theo các bước bên dưới để cài đặt Flake8 trên môi trường lập trình của bạn. Có thể bạn cần cài Pip trên máy trước.
1. Chạy lệnh bên dưới trong terminal để cài Flake8:
pip install flake8
2. Xác minh rằng Flake8 đã được cài thành công bằng cách chạy lệnh sau:
flake8 --version
3. Nếu Flake8 được cài chính xác, bạn sẽ thấy đầu ra tương tự như sau:
4.0.1 (mccabe: 0.6.1, pycodestyle: 2.8.0, pyflakes: 2.4.0) CPython 3.9.13 on
Linux
Sau khi cài thành công Flake8, bạn có thể bắt đầu dùng nó.
Dùng Flake8 để phân tích code Python
Để hiểu cách dùng Flake8, bắt đầu bằng code sau. Nó có một số lỗi cố ý. Sao chép nó vào file tên greeting.py.
def greeting(name):
print("Hello, " + name)
greeting("Alice")
greeting("Bob")
Chạy Flake8 trên một file
Công thức để chạy Flake8 trên một file như sau:
flake8 path/to/file.py
Ở ví dụ này, điều hướng tới thư mục chứa file greting.py và chạy lệnh sau.
flake8 greeting.py
Flake8 sẽ trả về thông báo cho biết có các lỗi cố tình:
greeting.py:5:1: E999 IndentationError: unexpected indent
Kết quả này chỉ ra rằng dòng 5 được thụt lề không cần thiết. Để khắc phục, bạn cần loại bỏ khoảng cách ở phần đầu của dòng này.
def greeting(name):
print("Hello, " + name)
greeting("Alice")
greeting("Bob")
Giờ khi chạy Flake8, bạn sẽ nhận được cảnh báo sau:
greeting.py:4:1: E305 expected 2 blank lines after class or function definition, found 1
greeting.py:5:16: W292 no newline at end of file
Kết quả cho biết có các lỗi sau:
- Dòng 4 sẽ có 2 dòng trống sau khi định nghĩa hàm greeting, nhưng thực tế chỉ có 1 dòng.
- Dòng 5 sẽ có một dòng mới ở cuối file.
Sau khi đã khắc phục những lỗi này, flake8 sẽ không trả về bất kỳ thông báo nào.
Hiện tại, chúng ta mới chỉ phân tích một file nhưng ở hầu hết trường hợp, bạn sẽ muốn phân tích nhiều file hơn.
Chạy Flake8 trên nhiều file
Giả sử bạn có test_greeting.py, chứa code sau:
from greeting import greeting
def test_greet():
assert greeting("Alice") == "Hello, Alice!"
Để phân tích 2 file này, chạy lệnh sau.
flake8 greeting.py test_greeting.py
Phương thức này hoạt động nhưng nếu bạn có nhiều hơn 2 file, nhập tên file có thể là công việc tẻ nhạt và dễ sinh lỗi.
Dùng lệnh sau sẽ tốt hơn trong việc phân tích tất cả file ở thư mục hiện tại:
flake8 .
Hiểu các lỗi và cảnh báo của Flake8
Flake8 báo cáo hai kiểu lỗi:
- Errors: Một lỗi cho biết lỗi cú pháp hoặc cấu trúc ngăn code của bạn chạy như lỗi thụt dòng ở ví dụ greeting.py.
- Warnings: Cảnh báo cho biết có lỗi tiềm ẩn hoặc vi phạm những quy tắc kiểu PEP 8 như “no newline at end of file” ở ví dụ greeting.py.
Một số lỗi và cảnh báo phổ biến:
- E101: thụt lề chứa hỗn hợp dấu cách và tab.
- E302: hi vọng có 2 dòng trống, nhưng lại tìm thấy 0.
- E999 IndentationError: thụt lề không mong muốn.
- W291: khoảng trắng ở cuối.
- E501: dòng quá dài (tối đa 79 ký tự).
- F401: mô-đun đã nhập nhưng chưa sử dụng.
Khi chạy Flake8, nó sẽ xuất một thông báo như ví dụ trên và số dòng, vị trí mã tham chiếu tới các thông báo. Điều này giúp bạn biết chính xác vị trí code có vấn đề nên bạn sẽ tiết kiệm đáng kể thời gian gỡ lỗi.
Cấu hình Flake8
Đối với một số dự án, những quy tắc của Flake8 có thể quá cứng nhắc. Trong trường hợp này, Flake8 cho phép bạn cấu hình nó và điều chỉnh hành vi của nó phù hợp với nhu cầu.
Bạn có thể cung cấp các lựa chọn cấu hình như:
- Bỏ qua lỗi hoặc cảnh báo cụ thể.
- Đặt độ dài dòng tối đa.
- Chỉ định các quy tắc bổ sung.
Ví dụ minh họa: Tạo một file cấu hình tên setup.cfg. Bạn cũng có thể thêm các lựa chọn cấu hình vào file tên tox.ini hoặc .flake8.
Trong file này, bắt đầu bằng cách tạo một phần flake8 như sau:
[flake8]
Sau đó, thêm các lựa chọn bạn muốn cấu hình:
[flake8]
max-line-length = 100
ignore = F401
Ở ví dụ này, max-line-length = 100 yêu cầu Flake8 đưa ra cảnh báo về dòng bất kỳ trong file mã nguồn vượt quá 100 ký tự về độ dài, ignore = F401 yêu cầu Flake8 bỏ qua lỗi liên quan tới import không sử dụng.
Bạn không cần thêm những lựa chọn này vào một file cấu hình vì có thể gọi chỉ định chúng trên dòng lệnh như sau:
flake8 --ignore E203 --max-line-length 100
Dùng file cấu hình là phương pháp tiếp cận tốt nhất vì bạn không cần chỉ định các lựa chọn giống nhau mỗi lần sử dụng flake8.
Trên đây là cách dùng Flake8 để “lint” code Python. Hi vọng bài viết hữu ích với các bạn.