2009-08-23 41 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 2009-08-23 15:25:34

回答

35

在過去,我主要使用PyLint - 它可以突出顯示何時使用未定義的變量,何時導入而不使用它們等等。

它可能有點冗長,抱怨線長超過80個字符,變量不匹配特定的正則表達式,公共方法太少的類,缺少文檔的方法等。

例如,對於腳本..

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:disable-msg=R0903,C0103,R0903,F0401,C0301 

..或者作爲命令行參數的pylint的命令:

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消息的多少行ategory,並給你的代碼一個「分數」 - 10是沒有消息,0通常是一個語法錯誤

另一種選擇是PyFlakes,我覺得有點不太過分冗長(我最近開始使用它的地方的PyLint)。再次使用上面的腳本,PyFlakes提供了以下信息:

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

我使用的最後一個選項是pep8.py,它顧名思義強制PEP8。它是迄今爲止最迂腐的腳本,在函數/類之前/之後執行正確的空白行,在代碼周圍放置空格,修正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代碼的很多靜態分析,所以我將pep8.py與PyLint或PyFlakes結合使用。

pep8.pypython mailing list here最初宣佈的,但在這個下載鏈接是已經死了。有在github.com/cburroughs/pep8.py是由cburroughs一個github上鏡,有一些小的修正,也可以從an older revision

搶未修改版本

PyChecker是另一種選擇,雖然我沒有使用它

+0

哇,爲解釋所花費的時間的榮譽 – solarc 2009-08-23 19:16:56

12

pylintpyflakes將是一個良好的開端。

特別是pylint是非常可配置的,你可以用它強制執行很多事情。

+0

太棒了,看起來正是我在找的:) – solarc 2009-08-23 15:45:41

+0

鏈接到pyflakes壞了 – Stefan 2014-02-18 16:10:47

4

在接管現有(遺留)項目時搜索pep8樣式執行工具時發現此stackoverflow問題。

https://github.com/hhatto/autopep8

autopep8 -i yourpythonsourcefile.py 

它將自動轉換所有的源代碼與PEP8確認。嘗試了我的遺留項目,它效果很好。所以我想我會在這裏更新這個答案。