Jak sprawdzać zgodność kodu Pythona z PEP8
- Opublikowano July 9, 2009
- komentarze 13
Znalazłem ostatnio bardzo fajne narzędzie do sprawdzania czy kod Pythona jest zgodny z zalecanym stylem pisania kodu w Pythonie(PEP8). Jest to skrypt uruchamiany z konsoli który sprawdza czy wskazany moduł jest zgodny z PEP8.
Przykład użycia:
$ pep8.py --filename=*.py --show-source --show-pep8 /sciezka/do/projektu/ parts/djangopl/sitemaps.py:14:5: E301 expected 1 blank line, found 0 def changefreq(self, obj): ^ Separate top-level function and class definitions with two blank lines. Method definitions inside a class are separated by a single blank line. Extra blank lines may be used (sparingly) to separate groups of related functions. Blank lines may be omitted between a bunch of related one-liners (e.g. a set of dummy implementations). Use blank lines in functions, sparingly, to indicate logical sections. ...
parametry:
- filename - wzorzec jakie pliki mają być brane pod uwagę
- show-source - przy każdym błędzie będzie wypisany kawałek kodu i wskazane w którym miejscu jest błąd
- show-pep8 - do każdego błędu będzie podane wyjaśnienie z dokumentu PEP8
Wynik działania prezentuje się bardzo ładnie i można szybko wychwycić gdzie jest błąd i zobaczyć dlaczego tak nie powinno się pisać kodu w Pythonie.
Znalazłem też opis jak zintegrować sprawdzanie zgodności z PEP8 z testami wykorzystywanymi w systemie typu continuous integration:
http://www.ajaxline.com/continuous-integration-in-django-project
Przydatne linki związane z PEP8:
- Dokument zalecanego stylu pisania kodu w Pythonie
- Ściąga z pep8 część 1
- Ściąga z pep8 część 2
- Ściąga z pep8 część 3
Komentarze
A jak byś widział taki walidator online ? masz na myśli aplikacje www do której wklejasz kawałek kodu? czy jak ?
Marcin: Tak Pylint też potrafi to robić, z tym że jak dla mnie Pylint jest za bardzo rozbudowany. Np nie radzi sobie z meta klasami które są często używane w Django i w miejscach gdzie było np. używane: Model.objects.all() zwracało błąd że Model nie ma właściwości objects. W przypadku tego prostego skryptu pep8 testowana jest tylko zgodność kodu z PEP8 i nic więcej, dzięki temu zwracane błędy są faktycznie błędami w stylu pisania kodu plus jest dokładne wyjaśnienie z PEP8 dlaczego to jest błąd i gdzie występuje w kodzie.
Bartek:
Tobie chodziło o integracje z testami ?
Jeżeli tak to tu jest prosty przykład przypadku testowego który sprawdza czy kod jest zgodny z PEP8.
Class TestCodeRules(TestCase): def testRules(self): sys.argv[1:] = ['--filename=*.py', yourproject.__path__[0]] buf = StringIO() sys.stdout = buf pep8.run() sys.stdout = sys.__stdout__ result = buf.getvalue(); self.assertEqual("", result, "Code messages should be empty but was:\n" + result)
Dominik, masz rację, Pylint jest rozbudowany, ale ma rzecz która jest bardzo przydatna - pozwala ignorować błędy, według rodzaju.
Ja osobiscie uzwywam tabow co jest niezgodne z PEP8 (?) bo mam takie widzimisie, odpowiedni parametr i pylint nie marudzi.
Używam PyDev i bardzo sobie chwalę pylinta, po każdym zapisie kod jest analizowany. Nie trzeba nic odpalać :)
Tutaj jest też opcja --ignore która pozwala ignorować określone typu błędów.
Co do Pydeva to tam idzie ustawić żeby automatycznie wstawiał 4 spacje na tabulator, więc nie widzę problemu po co stosować tabulatory.
@Dominik Szopa: nie, nie - mi chodziło o aplikację do której możesz wkleić kod lub też przesłać plik z kodem, a jako wynik otrzymujesz ładnie sformatowany raport :)
@Bartek: Nie wiem czy to by miało sens, raczej w formie ciekawostki niż przydatnego narzędzia. Raczej myślałem żeby kiedyś zbudować w Django taki system continuous integration.
Można by wykorzystać do tego: http://code.google.com/p/django-cron/
Wyglądało by to tak że wprowadzasz do bazy config buildouta, ustalasz o której godzinie ma się odpalać. To tworzy wirtualne środowisko za pomocą virtalenv, buduje wszystkie zależności projektu i uruchamia testy. Dodatkowo sprawdza pokrycie kodu testami i sprawdza zgodność kodu z PEP8. Jako wynik otrzymujesz ładny raport :)
No ty już myślisz w kategoriach GIGA :) Ja myślałem raczej właśnie jako ciekawostkę, bo kto ma czas żeby siedzieć nad tym.. :)
Well I can't read the text, but I'll point out (1) reindent (see PyPI) and (2) the subprocess module for capturing command output. (Though of course pep8.py is just Python...)
@Ken: Text is about checking Python source code formatting, according to PEP8 with pep8.py script.
The example i gave in comment, is about TestCase that test python source code with pep8.py. It's taken from here. I know it could be written simpler, it's just example that it's possible.
What do you mean by "reindent (see PyPI)"?
Hey
I like Your website. It is very interesting. Do You have RSS so I can add to my favorites. Let me know when it will be ready. Kee it UP. see ya Szczecin Hotele
Bardzo ciekawy skrypt - może warto zastanowić się nad walidatorem on-line?