2009-08-23 16 views
17

Próbuję znaleźć narzędzie do sprawdzania stylu kodowania w python.Narzędzie do wymuszenia stylu/standardów kodu Pythona

dla PHP Widziałem tam jest Kodeks Sniffer, a mały perl script wykorzystywane przez Drupal. Czy istnieje takie narzędzie do kodu Pythona?

+0

Właśnie znalazłem o pep8.py, ale strona się nie ładuje. Jednak nadal znajduje się w pamięci podręcznej Google http://74.125.93.132/search?q=cache:-sI5YpbDc9MJ:svn.browsershots.org/trunk/devtools/pep8/pep8.py+pep8.py Czy to jedyne narzędzie ? czy są jakieś inne lepsze? – solarc

Odpowiedz

35

W przeszłości korzystałem głównie z PyLint - można wyróżnić, gdy użyto niezdefiniowanej zmiennej, podczas importowania rzeczy bez ich używania itd.

Może to być trochę gadatliwe, narzekając na takie rzeczy, jak linie o długości ponad 80 znaków, zmienne nie pasujące do konkretnych regexów, klasy mające zbyt mało publicznych metod, metody, których brakuje w dokumentach.

Na przykład dla skryptu ..

import os 
import somefakelib 

def myfunc(x): 
    blah = "Something" 
    print os.listdir(x+blh) 

pylint generuje następujące komunikaty:

C: 1: Missing docstring 
F: 2: Unable to import 'somefakelib' (No module named somefakelib) 
C: 4:myfunc: Missing docstring 
C: 4:myfunc: Invalid name "x" (should match [a-z_][a-z0-9_]{2,30}$) 
C: 4:myfunc: Invalid name "x" (should match [a-z_][a-z0-9_]{2,30}$) 
E: 6:myfunc: Undefined variable 'blh' 
W: 5:myfunc: Unused variable 'blah' 
W: 2: Unused import somefakelib 

wszystkie są ważne skarg, ale staram się wyłączyć wiele komunikatów konferencyjnych i refaktoryzacji . Można wyłączyć konkretne wiadomości, albo jako komentarze w kodzie:

#pylint:disable-msg=R0903,C0103,R0903,F0401,C0301 

..or jako argumenty wiersza polecenia do polecenia pylint:

pylint --disable-msg=R0903,C0103,R0903,F0401,C0301 myfile.py 

Z powyższych komunikatów wyłączony, generuje następujące komunikaty dla powyższego kodu:

C: 1: Missing docstring 
C: 4:myfunc: Missing docstring 
E: 6:myfunc: Undefined variable 'blh' 
W: 5:myfunc: Unused variable 'blah' 
W: 2: Unused import somefakelib 

pylint generuje również raport „kod”, w tym jak wiele linii kodu/komentarze/docstring/spacji plik, liczby wiadomości per-c ategory i daje swojemu kodowi "wynik" - 10 oznacza brak wiadomości, 0 ogólnie jest to błąd składni

Inną opcją jest PyFlakes, które uważam za nieco mniej przesadne (ostatnio zacząłem używać go w miejscu PyLint). Ponownie stosując powyższy scenariusz, PyFlakes daje następujące komunikaty:

example.py:2: 'somefakelib' imported but unused 
example.py:6: undefined name 'blh' 

Ostatnią opcją używam to pep8.py, który jak sama nazwa wskazuje wymusza PEP8. Jest to zdecydowanie najbardziej ... pedantyczny skrypt, wymuszający rzeczy takie jak poprawne puste linie przed/po funkcjach/klasach, odstępy wokół kodu, prawidłowe wcięcie 4-spacji itd.

bieganie na powyższym kodzie produkuje następujące:

example.py:4:1: E302 expected 2 blank lines, found 1 
example.py:6:23: E201 whitespace after '(' 
example.py:6:32: W292 no newline at end of file 

Jest przeważnie wymusza stylistyczne rzeczy jak poprawnej spacją, to nie robi dużo statyczną analizę kodu podobnego pylint lub PyFlakes, więc użyj pep8.py w połączeniu z PyLint lub PyFlakes.

pep8.py pierwotnie ogłoszono na python mailing list here, ale link do pobrania w tym jest teraz martwy .. Jest lustro github przez cburroughs, z kilkoma niewielkimi poprawkami w github.com/cburroughs/pep8.py, lub można pobrać w wersji niezmodyfikowanej od an older revision

PyChecker to inna opcja, chociaż nie używałem tego

+0

wow, kudos na czas potrzebny do wyjaśnienia – solarc

12

pylint i pyflakes byłby dobry początek.

pylint w szczególności jest bardzo konfigurowalny i można wymusić sporo rzeczy z nim.

+0

Świetnie, wydaje się dokładnie to, czego szukam :) – solarc

+0

Link do pyflakes jest zepsuty – Stefan

4

Znalazłem to pytanie stackoverflow podczas wyszukiwania narzędzia egzekwowania stylu pep8 przy przejęciu istniejącego (starszego) projektu.

https://github.com/hhatto/autopep8

autopep8 -i yourpythonsourcefile.py 

automagicznie przekonwertować cały kod źródłowy, aby potwierdzić z pep8. Wypróbowałem to w moim starszym projekcie i działa świetnie. Pomyślałem więc, że zaktualizuję tę odpowiedź tutaj, w SO.

Powiązane problemy