2009-08-23 4 views
17

私はPythonでコーディングスタイルをチェックするツールを探しています。Pythonコードスタイル/標準を適用するツール

PHPの場合、Code Snifferがあり、Drupalが使用しているのはperl scriptです。 Pythonコードのためのそのようなツールはありますか?

+0

私はちょうどpep8.pyについて見つけましたが、ページは読み込まれません。しかしそれはまだGoogleのキャッシュにありますhttp://74.125.93.132/search?q=cache:-sI5YpbDc9MJ:svn.browsershots.org/trunk/devtools/pep8/pep8.py+pep8.py それは唯一のツールですか?他に良い点はありますか? – solarc

答えて

35

これまでは、PyLintを主に使用していました。未定義の変数を使用したとき、使用しないときなどにインポートするときに強調表示できます。

80文字以上の長さの行、特定の正規表現に一致しない変数、パブリックメソッドがあまりないクラス、docs-tringsがないメソッドなどについて苦情を申し立てることができます。

たとえば、スクリプトの...

import os 
import somefakelib 

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

PyLintは、次のメッセージを生成します。

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 

彼らはすべての有効な苦情ですが、私は大会やリファクタリングのメッセージの多くを無効にする傾向があります。あなたはどちらかあなたのコード内のコメントとして、特定のメッセージを無効にすることができますPyLintコマンドのコマンドライン引数として

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

..or:

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

を無効にして上記のメッセージと、それは次のメッセージを生成します

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も、ファイルが持っているどのように多くのコード/コメント/ドキュメンテーション文字列/空白の行を含む「コードレポート」、あたり-Cメッセージの数を生成します。上記のコードのためにあなたのコードに「スコア」を与えます.10はメッセージなし、0は一般的に構文エラーです

もう1つのオプションはPyFlakesです。これは少し冗長すぎます(私は最近、 PyLintの)再度、上記のスクリプトを使用して、PyFlakesは、次のメッセージを与える:私が使用

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

最後のオプションは、名前が示すPEP8を強制するようpep8.py、です。関数/クラスの前後で正しい空白行、コードの周りにスペースを入れたり、4桁の字下げなどを行うなど、賢明なスクリプトです。上記のコードで実行

が、それは次のように生成します。それは主に正しい空白のような文体の事を強制され

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 

、それはPyLintまたはPyFlakesのようなコードの多くの静的解析を行うので、私はありませんPyLintまたはPyFlakesと一緒にpep8.pyを使用してください。

pep8.pyはもともとpython mailing list hereに発表されたが、この中にダウンロードリンクが今死んでいる...そこcburroughsにより、githubのミラーがgithub.com/cburroughs/pep8.pyでいくつかのマイナーな修正で、だ、またはあなたがan older revision

から変更されていないバージョンをつかむことができます

PyCheckerは別のオプションですが、私はそれを使用していません

+0

時間の説明のために取られた – solarc

2

reindent.pyという名前のスクリプトは、システムのPythonディストリビューションに含まれていることがあります。このコードは、すべてのコードを推奨インデント4スペースに再インデントします。

相続人は、あなたのディストリビューションでそれを見つけることができない場合は、そのコピー:http://www.koders.com/python/fid24D30FCD2CE388C67CB980EF55630D25970CFB96.aspx?s=cdef%3Aparser

+0

ありがとう、ちょうど1つのことをチェックしますが、それは便利になるでしょう。 – solarc

12

pylintpyflakesは良いスタートになります。

特に、pylintは設定が非常に簡単で、多くのことを実行できます。

+0

偉大な、ちょうど私が探しているようだ:) – solarc

+0

pyflakesにリンクしている – Stefan

4

既存の(レガシー)プロジェクトを引き継ぐときにpep8スタイルの強制ツールを検索する際にこのstackoverflow質問が見つかりました。

https://github.com/hhatto/autopep8

autopep8 -i yourpythonsourcefile.py 

自動的pep8を確認するために、すべてのソースコードを変換します。私のレガシープロジェクトで試してみると素晴らしい作品です。だから私はここでこの答えを更新すると思った。

関連する問題