Jak sprawdzać zgodność kodu Pythona z PEP8

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:

Komentarze

9 July, 2009, 10:16 p.m.:

Bardzo ciekawy skrypt - może warto zastanowić się nad walidatorem on-line?

10 July, 2009, 6:12 a.m.:

A jak byś widział taki walidator online ? masz na myśli aplikacje www do której wklejasz kawałek kodu? czy jak ?

Marcin
10 July, 2009, 6:27 a.m.:

Hm,

A czy Pylint też nie sprawdzą pod tym względem kodu pythona ?

10 July, 2009, 6:46 a.m.:

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.

10 July, 2009, 7 a.m.:

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.

:::python
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)

Marcin
10 July, 2009, 7:05 a.m.:

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ć :)

Dominik Szopa
10 July, 2009, 8:26 a.m.:

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.

10 July, 2009, 9:01 a.m.:

@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 :)

10 July, 2009, 9:48 a.m.:

@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 :)

10 July, 2009, 11:33 a.m.:

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.. :)

Ken Arnold
10 July, 2009, 4:42 p.m.:

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...)

Dominik Szopa
11 July, 2009, 11:50 a.m.:

@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)"?

17 July, 2009, 7:49 a.m.:

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


Comments turned off