Linters là gì?
Linters là các chương trình tư vấn về chất lượng mã bằng cách hiển thị các cảnh báo và lỗi. Họ có thể phát hiện các lỗi mã Python của bạn, nhận thấy các mẫu mã không hợp lệ và tìm các phần tử không tuân theo quy ước của bạn. Linter Python có một số lợi thế, chẳng hạn như.
- Ngăn chặn lỗi trong một dự án
- Làm cho mã có thể đọc được cho bất kỳ lập trình viên python nào
- Bắt các đoạn mã không cần thiết
- Làm cho mã sạch hơn và ít phức tạp hơn
Tất nhiên, phương pháp nào cũng có nhược điểm của nó.
- Linters có thể trả lại kết quả dương tính giả
- Quá trình này có thể tốn nhiều thời gian
- Một số lỗi có thể bỏ qua.
Có rất nhiều công cụ Python mà bạn có thể tận dụng trong công việc hàng ngày của mình. Sơ đồ logic cho chúng ta biết về các lỗi mã thực tế và sơ đồ thống kê giúp lập trình viên phát hiện các vấn đề về định dạng. Tôi sẽ trình bày cách cài đặt và chạy các linters phổ biến nhất như
- Pylint [phiên bản 2. 12. 1]
- Flake8 [phiên bản 4. 0. 1]
- PyFlakes [phiên bản 2. 4. 0]
Hơn nữa, bạn sẽ tìm thấy một so sánh của từng đầu ra. Điều này có thể giúp bạn chọn máy nói dối phù hợp nhất với nhu cầu của bạn
Một ví dụ về mã Python chất lượng kém
Hãy viết một số mã có một số lỗi và không tuân theo các quy tắc PEP. Sau đó, chúng tôi sẽ kiểm tra chất lượng mã Python bằng cách sử dụng các bộ lọc khác nhau với cấu hình mặc định
import math; global_value = 0 def Bad_Quality_Function[argument1]: a = [1,2,3] a[10] = 10 DivideByZero = math.e/0 if a[10]==1: Another_Bad_Quality_Function[] else: return result pass
Dưới đây một số vấn đề với mã ví dụ được liệt kê
- dấu chấm phẩy không cần thiết trong nhập toán học;
- thiếu dòng mới và khoảng trắng
- thiếu chuỗi tài liệu
- chưa sử dụng global_value và argument1
- cách đặt tên không chính xác
- chọn phần tử từ danh sách có chỉ mục không chính xác
- chia cho biểu thức không
- gọi một phương thức không tồn tại
- trả về giá trị không xác định
- câu lệnh vượt quakhông cần thiết
giá treo
Pylint là một công cụ phân tích mã Python tĩnh để tìm các lỗi lập trình và kiểu dáng, lỗi, cấu trúc mã không hợp lệ và sự không nhất quán với các tiêu chuẩn mã hóa. Hơn nữa, Pylint có thể được tùy chỉnh theo nhu cầu của chúng tôi bằng cách làm im lặng một số lỗi được báo cáo, ví dụ:. g. thông báo đầu ra chỉ có thể chứa thông tin về lỗi đối với các sự cố lập trình quan trọng nhất
Thông báo Pylint bao gồm năm loại lỗi
- R – có nghĩa là bạn phải cấu trúc lại mã theo các phương pháp lập trình tốt
- C – mã của bạn vi phạm quy ước tiêu chuẩn mã hóa
- W – cảnh báo về các vấn đề về phong cách hoặc một số vấn đề nhỏ về lập trình
- E – có nghĩa là lỗi, có các vấn đề lập trình quan trọng
- F – lỗi nghiêm trọng dừng xử lý mã
Để có được Pylint, bạn có thể sử dụng pip
pip install pylint
Để chạy tập lệnh Python này, chỉ cần viết
pylint script.py
trong bảng điều khiển của bạn, nơi tập lệnh. py là tên của tập lệnh Python với ví dụ mã xấu của chúng tôi
[venv] user@user project % pylint script.py ************* Module main main.py:1:0: W0301: Unnecessary semicolon [unnecessary-semicolon] main.py:12:0: C0305: Trailing newlines [trailing-newlines] main.py:1:0: C0114: Missing module docstring [missing-module-docstring] main.py:2:0: C0103: Constant name "global_value" doesn't conform to UPPER_CASE naming style [invalid-name] main.py:3:0: C0103: Function name "Bad_Quality_Function" doesn't conform to snake_case naming style [invalid-name] main.py:3:0: C0116: Missing function or method docstring [missing-function-docstring] main.py:4:4: C0103: Variable name "a" doesn't conform to snake_case naming style [invalid-name] main.py:6:4: C0103: Variable name "DivideByZero" doesn't conform to snake_case naming style [invalid-name] main.py:8:8: E0602: Undefined variable 'Another_Bad_Quality_Function' [undefined-variable] main.py:11:8: W0101: Unreachable code [unreachable] main.py:10:15: E0602: Undefined variable 'result' [undefined-variable] main.py:11:8: W0107: Unnecessary pass statement [unnecessary-pass] main.py:3:0: R1710: Either all return statements in a function should return an expression, or none of them should. [inconsistent-return-statements] main.py:3:25: W0613: Unused argument 'argument1' [unused-argument] main.py:6:4: W0612: Unused variable 'DivideByZero' [unused-variable] ---------------------------------------------------------------------- Your code has been rated at -13.00/10 [previous run: -13.00/10, +0.00]
Thông báo đầu ra của Pylint thông báo về 15 vấn đề cần được giải quyết nếu chúng ta muốn cải thiện chất lượng mã Python. Hãy tóm tắt chúng trong bảng dưới đây
Pylint đã thông báo cho chúng tôi về tất cả các lỗi mà chúng tôi đã dự kiến, ngoài các lỗi liên quan đến việc chọn một phần tử từ danh sách có chỉ mục không chính xác, biểu thức chia cho 0 và thiếu khoảng trắng. Ngoài ra, Pylint đã chỉ ra rằng sau câu lệnh if-else, mã sẽ không thể truy cập được, điều đó có nghĩa là nó sẽ không bao giờ được thực thi. Ở cuối thông báo của Pylint, chúng ta có thể thấy rằng Pylint đã xếp hạng mã ở mức -13. 00/10 [vâng, trừ mười ba. ].
vảy8
Một ví dụ khác về kẻ nói dối Python là Flake8. Nó trả về một báo cáo chứa thông tin về kiểu dáng không chính xác, lỗi cú pháp không nhất quán và lỗi phức tạp. Có nhiều tùy chọn bổ sung cho phép bạn điều chỉnh Flake8 theo nhu cầu của mình
Flake8 chạy ba công cụ được liệt kê bên dưới bằng cách khởi chạy một lệnh flake8 .
- pycodestyle – kiểm tra phong cách
- PyFlakes – kiểm tra cú pháp
- Tập lệnh McCabe của Ned Batchelder – kiểm tra độ phức tạp
Đầu ra của Flake8 bao gồm các loại lỗi như
- E – lỗi phong cách
- W – cảnh báo kiểu
- F – lỗi cú pháp
- C – lỗi phức tạp
- N – lỗi quy ước đặt tên
Để cài đặt Flake8, bạn có thể sử dụng pip
pip install flake8
Chạy Flake8 thật dễ dàng. chạy
flake8 script.py
để xem kết quả
[venv] user@user project % flake8 script.py main.py:1:12: E703 statement ends with a semicolon main.py:3:1: E302 expected 2 blank lines, found 0 main.py:4:11: E231 missing whitespace after ',' main.py:4:13: E231 missing whitespace after ',' main.py:6:5: F841 local variable 'DivideByZero' is assigned to but never used main.py:7:13: E225 missing whitespace around operator main.py:8:9: F821 undefined name 'Another_Bad_Quality_Function' main.py:10:16: F821 undefined name 'result' main.py:12:1: W391 blank line at end of file
Flake8 đã báo cáo 9 lỗi có thể xảy ra. Hãy tóm tắt chúng trong một bảng
Flake8 đã xác định dấu chấm phẩy không cần thiết, thiếu dòng mới và khoảng trắng, đối số cục bộ không được sử dụng [nhưng nó không báo cáo đối số toàn cầu không được sử dụng], trả về giá trị không xác định và phương thức gọi không tồn tại. Thông báo đầu ra này chắc chắn ít chi tiết hơn thông báo của Pylint, nhưng đây chính là lý do tại sao một số nhà phát triển thích Flake8 hơn. Nó chỉ báo cáo về các lỗi kiểu, cú pháp và độ phức tạp quan trọng nhất
PyFlakes
PyFlakes phân tích mã python cho các lỗi đơn giản. PyFlakes sẽ không bao giờ phàn nàn về phong cách và sẽ rất cố gắng để không bao giờ đưa ra những thông tin sai lệch
Để cài đặt Pyflakes, hãy sử dụng pip
pip install pyflakes
Chạy Python linter này rất giống với Pylint và Flake8. Chỉ cần viết tên chương trình và đường dẫn đến mã của bạn như trong ví dụ
________số 8_______PyFlakes chỉ báo cáo 3 vấn đề. Hãy tóm tắt chúng trong một bảng
PyFlakes chỉ phàn nàn về phương thức gọi không tồn tại và đối số không sử dụng. Đầu ra rõ ràng và lỗi không được phân loại thành các loại cụ thể
Cái nào là kẻ nói dối trăn tốt nhất cho dự án của bạn?
Khách quan lựa chọn các công cụ lập trình tốt nhất có lẽ là không thể. Vấn đề là, một số công nghệ và công cụ phù hợp với một loại dự án, trong khi những công nghệ và công cụ khác lại tốt hơn cho các loại dự án khác. Vì vậy, làm thế nào để bạn chọn các linters thích hợp cho dự án của bạn? . Nếu bạn muốn cải thiện mã Python của mình bằng linters – và bạn thực sự nên tận dụng chúng trong công việc của mình – trước tiên hãy thử những đề xuất trong bài viết này
Phần kết luận
Trong bài viết này, tôi đã so sánh ba linter. Pylint, Flake8 và PyFlakes. Mỗi chương trình được chạy mà không cần bất kỳ cài đặt bổ sung nào. Pylint đã báo cáo hầu hết các lỗi, bao gồm một số lỗi mà chúng tôi không mong đợi [mã không thể truy cập được sau câu lệnh if-else]. Flake8 đã báo cáo ít lỗi hơn Pylint. Nó không thông báo cho chúng tôi về việc thiếu chuỗi tài liệu, kiểu đặt tên không chính xác và câu lệnh vượt qua không cần thiết. Tuy nhiên, chỉ có Flake8 báo cáo thiếu khoảng trắng. PyFlakes trả về danh sách lỗi ngắn nhất. Nó chỉ báo cáo về đối số không được sử dụng, giá trị không xác định và phương thức gọi không tồn tại. Không có linters nào được thử nghiệm cảnh báo chúng tôi về việc chọn một phần tử từ danh sách có chỉ số không chính xác hoặc biểu thức chia cho 0. Mặc dù vậy, điều này có thể giải thích được vì đây không phải là lỗi văn phong, mà là lỗi logic.
Rất khó để quyết định loại xơ vải nào được thử nghiệm trong bài viết này là tốt nhất. Xin lưu ý rằng mỗi công cụ có thể được tùy chỉnh với các cài đặt bổ sung. Tuy nhiên, tôi hy vọng rằng bài viết đã giúp bạn chọn được chiếc máy nói dối phù hợp nhất với nhu cầu của bạn. Liên hệ với chúng tôi nếu bạn cần hỗ trợ từ các lập trình viên Python có kinh nghiệm cho dự án của bạn