Pylint:讓你的 Python 程式碼保持一致

2019-10-25 17:01:00

當你想要爭論程式碼複雜性時,Pylint 是你的朋友。

Pylint 是更高層級的 Python 樣式強制程式。而 flake8black 檢查的是“本地”樣式:換行位置、注釋的格式、發現注釋掉的程式碼或紀錄檔格式中的錯誤做法之類的問題。

預設情況下,Pylint 非常激進。它將對每樣東西都提供嚴厲的意見,從檢查是否實際實現宣告的介面到重構重複程式碼的可能性,這對新使用者來說可能會很多。一種溫和地將其引入專案或團隊的方法是先關閉所有檢查器,然後逐個啟用檢查器。如果你已經在使用 flake8、black 和 mypy,這尤其有用:Pylint 有相當多的檢查器和它們在功能上重疊。

但是,Pylint 獨有之處之一是能夠強制執行更高階別的問題:例如,函數的行數或者類中方法的數量。

這些數位可能因專案而異,並且可能取決於開發團隊的偏好。但是,一旦團隊就引數達成一致,使用自動工具強制化這些引數非常有用。這是 Pylint 閃耀的地方。

設定 Pylint

要以空設定開始,請將 .pylintrc 設定為

[MESSAGES CONTROL]disable=all

這將禁用所有 Pylint 訊息。由於其中許多是冗餘的,這是有道理的。在 Pylint 中,message 是一種特定的警告。

你可以通過執行 pylint 來確認所有訊息都已關閉:

$ pylint <my package>

通常,向 pylint 命令列新增引數並不是一個好主意:設定 pylint 的最佳位置是 .pylintrc。為了使它做一些有用的事,我們需要啟用一些訊息。

要啟用訊息,在 .pylintrc 中的 [MESSAGES CONTROL] 下新增

enable=<message>,       ...

對於看起來有用的“訊息”(Pylint 稱之為不同型別的警告)。我最喜歡的包括 too-many-linestoo-many-argumentstoo-many-branches。所有這些會限制模組或函數的複雜性,並且無需進行人工操作即可客觀地進行程式碼複雜度測量。

檢查器訊息的來源:每條訊息只屬於一個檢查器。許多最有用的訊息都在設計檢查器下。預設數位通常都不錯,但要調整最大值也很簡單:我們可以在 .pylintrc 中新增一個名為 DESIGN 的段。

[DESIGN]max-args=7max-locals=15

另一個有用的訊息來源是“重構”檢查器。我已啟用一些最喜歡的訊息有 consider-using-dict-comprehensionstop-iteration-return(它會查詢正確的停止疊代的方式是 return 而使用了 raise StopIteration 的疊代器)和 chained-comparison,它將建議使用如 1 <= x < 5,而不是不太明顯的 1 <= x && 5 > 5 的語法。

最後是一個在效能方面消耗很大的檢查器,但它非常有用,就是 similarities。它會查詢不同部分程式碼之間的複製貼上來強制執行“不要重複自己”(DRY 原則)。它只啟用一條訊息:duplicate-code。預設的 “最小相似行數” 設定為 4。可以使用 .pylintrc 將其設定為不同的值。

[SIMILARITIES]min-similarity-lines=3

Pylint 使程式碼評審變得簡單

如果你厭倦了需要指出一個類太複雜,或者兩個不同的函數基本相同的程式碼評審,請將 Pylint 新增到你的持續整合設定中,並且只需要對專案複雜性準則的爭論一次就行。