2009-08-23 10 views
17

Ich versuche, ein Werkzeug zu finden, um nach Codierungsstil in Python zu überprüfen.Tool zum Erzwingen Python-Code-Stil/Standards

Für PHP habe ich gesehen, es ist der Code Sniffer, und eine kleine perl script von Drupal verwendet. Gibt es ein solches Tool für Python-Code?

+0

Ich habe gerade über pep8.py gefunden, aber die Seite wird nicht geladen. Aber es ist immer noch in der Google-Cache http://74.125.93.132/search?q=cache:-sI5YpbDc9MJ:svn.browsershots.org/trunk/devtools/pep8/pep8.py+pep8.py Ist es das einzige Werkzeug ? Gibt es noch etwas anderes? – solarc

Antwort

35

In der Vergangenheit habe ich hauptsächlich PyLint - es kann markieren, wenn Sie eine undefinierte Variable verwendet, wenn Sie Dinge importieren, ohne sie zu verwenden und so weiter.

Es kann ein wenig wortreich sein, beschwert sich über Dinge wie Linien über 80 Zeichen lang, Variable nicht zu bestimmten Regex, Klassen zu wenige öffentliche Methoden, Methoden fehlt Docs-Trings.

Zum Beispiel für Skript ..

import os 
import somefakelib 

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

PyLint generiert die folgenden Meldungen:

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 

Sie sind alle gültigen Beschwerden, aber ich neige dazu, eine Menge von der Konvention und Refactoring-Nachrichten zu deaktivieren . Sie können bestimmte Nachrichten deaktivieren, entweder als Kommentare in Ihrem Code:

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

..oder als Befehlszeilenargumente zum PyLint Befehl:

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

Mit den obigen Meldungen deaktiviert, es folgende Meldungen erzeugt für den oben stehenden Code:

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 erzeugt auch einen "Code-Report", darunter, wie viele Zeilen Code/Kommentare/docstring/Leerzeichen die Datei hat, die Anzahl der Nachrichten pro-c aegory, und gibt Ihrem Code eine "Punktzahl" - 10 keine Nachrichten, 0 ist in der Regel ein Syntaxfehler

Eine andere Option ist PyFlakes, die ich etwas weniger exzessiv-verbose finde (ich habe vor kurzem begonnen, es an Ort und Stelle zu verwenden von PyLint). Wieder das obige Skript verwenden, gibt Pyflakes die folgenden Meldungen:

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

Die letzte Option Ich verwende pep8.py ist, die wie der Name schon sagt PEP8 erzwingt. Es ist bei weitem das pedantischste Skript, das Dinge wie korrekte Leerzeilen vor/nach Funktionen/Klassen, Abstand um den Code, korrekten 4-Platz-Einzug usw. erzwingt.

auf dem Code-Lauf oben, erzeugt es die folgenden:

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 

Es meist stilistische Dinge wie richtige Leerzeichen erzwingt wird, tut es nicht viel statische Analyse des Codes wie PyLint oder Pyflakes, so dass ich Verwenden Sie pep8.py in Verbindung mit PyLint oder PyFlakes.

pep8.py ursprünglich auf den python mailing list here angekündigt wurde, aber der Download-Link in dieser ist jetzt tot .. Es ist ein Github Spiegel von cburroughs, mit einem paar kleineren Korrekturen an github.com/cburroughs/pep8.py, oder Sie können die unveränderte Version von an older revision

greifen

PyChecker ist eine andere Option, obwohl ich sie nicht verwende

+0

wow, ein großes Lob für die Zeit für die Erklärung – solarc

2

Es gibt ein Skript namens reindent.py, das manchmal in der Python-Distribution Ihres Systems enthalten ist, das Ihren gesamten Code durchläuft und wieder in die empfohlene Einrückung von vier Leerzeichen einfügt.

Heres eine Kopie davon in Fall können Sie es nicht in Ihrer Distribution finden: http://www.koders.com/python/fid24D30FCD2CE388C67CB980EF55630D25970CFB96.aspx?s=cdef%3Aparser

+0

Danke, obwohl es nur eine Sache überprüft, wird es nützlich sein. – solarc

12

pylint und pyflakes wäre ein guter Anfang sein.

pylint insbesondere ist sehr konfigurierbar, und Sie können einige Dinge damit erzwingen.

+0

Großartig, scheint genau das, was ich suche :) – solarc

+0

Link zu pyflakes ist gebrochen – Stefan

4

Diese stackoverflow Frage bei der Suche nach einem pep8 Stil Enforcement-Tool bei der Übernahme eines bestehenden (Legacy) -Projekts gefunden.

https://github.com/hhatto/autopep8

autopep8 -i yourpythonsourcefile.py 

werden alle den Quellcode automatisch konvertieren mit PEP8 zu bestätigen. Habe es bei meinem Altprojekt versucht und es funktioniert super. Also dachte ich, ich würde diese Antwort hier in SO aktualisieren.

Verwandte Themen