Wstęp
Na co dzień otaczają nas różne zasady, które mają ułatwić nam życie. Na przykład kierowcy muszą przestrzegać kodeksu drogowego. Dzięki temu każdy kierowca wie, jak zachować się na drodze i jakich zasad przestrzegać. W rezultacie jazda samochodem jest bezpieczniejsza, zachowanie kierowców przewidywalne, a wszyscy wiedzą, jak prowadzić pojazd w taki sposób, by inni rozumieli ich intencje. Dla Pythona istnieje odpowiednik kodeksu drogowego, czyli Python Enhancement Proposal (PEP). Ten dokument zawiera zasady, które mają poprawić Twój kod Python, czyniąc go bardziej czytelnym i spójnym. Niestety, nawet doświadczeni programiści mogą mieć problem z zapamiętaniem wszystkich zasad zapisanych w PEP. Dlatego właśnie powstały Python linters.
Czym są Linters?
Linters to programy, które doradzają w kwestii jakości kodu, wyświetlając ostrzeżenia i błędy. Potrafią wykryć błędy w kodzie Python, zauważyć nieprawidłowe wzorce kodu i znaleźć elementy niezgodne z Twoimi konwencjami. Python linters mają wiele zalet, takich jak:
- Zapobieganie błędom w projekcie.
- Uczynienie kodu czytelnym dla każdego python programmer.
- Wychwytywanie niepotrzebnych fragmentów kodu.
- Uproszczenie i oczyszczenie kodu.
Oczywiście każde podejście ma swoje wady:
- Linters mogą zwracać false positives.
- Proces ten może być czasochłonny.
- Niektóre błędy mogą zostać przeoczone.
Istnieje wiele Python linters, które możesz wykorzystać w codziennej pracy. Logical lint informuje o rzeczywistych błędach w kodzie, a statistical lint pomaga programiście zauważyć problemy z formatowaniem. Pokażę, jak zainstalować i uruchomić najpopularniejsze linters, takie jak:
- Pylint (wersja 2.12.1)
- Flake8 (wersja 4.0.1)
- PyFlakes (wersja 2.4.0)
Ponadto znajdziesz porównanie każdego z outputów. Może to pomóc Ci wybrać linter najlepiej dopasowany do Twoich potrzeb.
Przykład kodu Python o złej jakości
Napiszmy kod, który zawiera kilka błędów i nie przestrzega zasad PEP. Następnie sprawdzimy jakość kodu Python przy użyciu różnych linters z domyślną konfiguracją.
Poniżej wymieniono niektóre problemy z przykładowym kodem:
- niepotrzebny semicolon w import math;
- brak nowych linii i spacji
- brak docstring
- nieużywana global_value i argument1
- nieprawidłowy styl nazewnictwa
- wybieranie elementu z listy z nieprawidłowym indeksem
- dzielenie przez zero
- wywołanie nieistniejącej metody
- zwracanie niezdefiniowanej wartości
- niepotrzebny pass statement
Pylint
Pylint to narzędzie do statycznej analizy kodu Python, które znajduje błędy programistyczne i stylistyczne, bugs, nieprawidłowe konstrukcje kodu oraz niespójności ze standardami kodowania. Ponadto Pylint można dostosować do własnych potrzeb, wyciszając niektóre zgłaszane błędy, np. output messages mogą zawierać tylko informacje o najważniejszych błędach programistycznych.
Wiadomość Pylint składa się z pięciu typów błędów:
- R – musisz zrefaktoryzować kod zgodnie z dobrymi praktykami programistycznymi.
- C – Twój kod narusza konwencje standardów kodowania.
- W – ostrzeżenia dotyczące problemów stylistycznych lub drobnych problemów programistycznych.
- E – błędy, ważne problemy programistyczne.
- F – fatal errors, które zatrzymują przetwarzanie kodu.
Aby zainstalować Pylint, użyj pip.
Aby uruchomić ten Python linter, po prostu wpisz:
w konsoli, gdzie script.py to nazwa pliku z naszym przykładowym złym kodem.
Wiadomość output Pylint informuje o 15 problemach, które należy rozwiązać, jeśli chcemy poprawić jakość kodu Python. Podsumujmy je w tabeli poniżej:
Pylint poinformował nas o wszystkich spodziewanych błędach, z wyjątkiem błędów związanych z wybieraniem elementu z listy z nieprawidłowym indeksem, dzieleniem przez zero i brakującymi spacjami. Dodatkowo Pylint wskazał, że po instrukcji if-else kod staje się unreachable, co oznacza, że nigdy nie zostanie wykonany. Na końcu wiadomości Pylint widzimy, że ocenił kod na -13.00/10 (tak, minus trzynaście!).

Flake8
Kolejnym przykładem Python lintera jest Flake8. Zwraca on raport zawierający informacje o nieprawidłowym stylu, niespójnościach składni i błędach złożoności. Istnieje wiele dodatkowych opcji pozwalających dostosować Flake8 do własnych potrzeb.
Flake8 uruchamia trzy narzędzia za pomocą jednej komendy flake8:
- pycodestyle – sprawdzanie stylu
- PyFlakes – sprawdzanie składni
- McCabe script Neda Batcheldera – sprawdzanie złożoności
Output Flake8 składa się z typów błędów takich jak:
- E – błędy stylu
- W – ostrzeżenia stylu
- F – błędy składni
- C – błędy złożoności
- N – błędy konwencji nazewnictwa

Aby zainstalować Flake8, użyj pip.
Uruchomienie Flake8 jest proste. Wpisz:
i zobacz wyniki.
Flake8 zgłosił 9 możliwych błędów. Podsumujmy je w tabeli.
Flake8 zidentyfikował niepotrzebny semicolon, brak nowych linii i spacji, nieużywany lokalny argument (ale nie zgłosił nieużywanego globalnego argumentu), zwracanie niezdefiniowanej wartości i wywołanie nieistniejącej metody. Ten output jest zdecydowanie mniej szczegółowy niż Pylint, ale właśnie dlatego niektórzy deweloperzy wolą Flake8 – raportuje tylko o najważniejszych błędach stylu, składni i złożoności.

PyFlakes
PyFlakes analizuje kod Python pod kątem prostych błędów. PyFlakes nigdy nie narzeka na styl i bardzo stara się nie zgłaszać false positives.
Aby zainstalować PyFlakes, użyj pip:
Uruchomienie tego Python lintera jest bardzo podobne do Pylint i Flake8. Po prostu wpisz nazwę programu i ścieżkę do kodu, jak w przykładzie:
PyFlakes zgłosił tylko 3 problemy. Podsumujmy je w tabeli.
PyFlakes zgłasza tylko wywołanie nieistniejącej metody i nieużywany argument. Output jest przejrzysty, a błędy nie są kategoryzowane na konkretne typy.

Który Python linter jest najlepszy dla Twojego projektu?
Obiektywnie wybrać najlepsze narzędzia programistyczne jest prawdopodobnie niemożliwe. Chodzi o to, że niektóre technologie i narzędzia są odpowiednie dla jednego typu projektów, podczas gdy inne lepiej sprawdzają się w innych. Jak więc wybrać odpowiednie linters do swojego projektu? Wspomniane w tym artykule Python linters są open-source i dostępne za darmo; zostały przetestowane przez wielu profesjonalistów i są bardzo popularne wśród deweloperów na całym świecie. Jeśli chcesz poprawić swój kod Python za pomocą linters – a naprawdę warto z nich korzystać – najpierw wypróbuj te polecane w tym artykule.
Podsumowanie
W tym artykule porównałem trzy linters: Pylint, Flake8 i PyFlakes. Każdy program został uruchomiony bez dodatkowych ustawień. Pylint zgłosił najwięcej błędów, w tym takie, których się nie spodziewaliśmy (unreachable code po instrukcji if-else). Flake8 zgłosił mniej błędów niż Pylint. Nie poinformował o brakujących docstrings, nieprawidłowych stylach nazewnictwa i niepotrzebnym pass statement. Jednak tylko Flake8 zgłosił brakujące spacje. PyFlakes zwrócił najkrótszą listę błędów – zgłosił tylko nieużywany argument, niezdefiniowaną wartość i wywołanie nieistniejącej metody. Żaden z testowanych linters nie ostrzegł nas o wybieraniu elementu z listy z nieprawidłowym indeksem ani o dzieleniu przez zero. Jest to jednak zrozumiałe, ponieważ nie są to błędy stylistyczne, lecz logiczne.
Trudno zdecydować, który z testowanych linters jest najlepszy. Pamiętaj, że każde z narzędzi można dostosować za pomocą dodatkowych ustawień. Mam jednak nadzieję, że artykuł pomógł Ci wybrać linter najlepiej dopasowany do Twoich potrzeb. Skontaktuj się z nami, jeśli potrzebujesz wsparcia doświadczonych Python programmers w swoim projekcie.
Cloud backup services jak wybrac najlepsza opcje