Python 靜態分析Pylint、Pyflakes 與 Mypy ——我應該用誰?
python
攝影:產品經理
黃金炒飯配麻婆豆腐
說到 Python 的靜態分析工具,就不得不說Pylint、Pyflakes 和 Mypy。他們的做用有重疊的地方,但又有各自的側重點。在某些時候你能夠只選擇其中一個來用,有時候你又須要把他們結合起來使用。ide
Pylint:讓你的代碼符合 PEP-8風格
PEP-8[1]是 Python 的官方編碼風格指導。咱們平時經常說到的:函數
1.函數名、變量名使用小寫字母和下劃線,類名使用駝峯命名法
2.縮進使用4個空格
3.運算符、賦值符號左右側都要有空格,冒號右側有空格左側沒有空格
4.多行字符串用三對單引號,可是 docstring 用三對雙引號
5.……
這些都是PEP-8中明確建議的編碼風格。工具
Pylint 主要的功能就是用於編碼風格的檢驗,在默認狀況下 Pylint 會以 PEP-8爲標準,若是你寫的代碼不符合 PEP-8編碼規範,它就會給你報錯。編碼
以下圖所示:
3d
經過修改 pylint 的配置文件,能夠修改它檢查的方式,從而使它遵照其餘的編碼規範,例如大家團隊大部分人是從 Java 轉到 Python 的,那麼能夠強行讓變量名函數名都變成駝峯命名法。code
使用 Pylint 方便團隊造成統一的編碼規範。blog
Pyflakes: 代碼邏輯和語法檢查
若是你使用的 Vim 或者記事原本寫代碼,那麼能夠用 Pyflakes 來檢查代碼是否是有語法錯誤或者邏輯錯誤。文檔
Pyflakes 不會檢查代碼的風格,因此上面被 Pylint 報了一大堆錯的文件,用 Pyflakes 來檢查,它只會報三個錯:
字符串
也就是變量定義了可是沒有使用。
但若是有語法錯誤,那麼 Pyflakes 就能成功發現:
須要注意的是,因爲 Pyflakes 是靜態分析的工具,因此對於像'1' + 1這種異常是沒法檢查出來的。
Mypy:靜態類型檢查器
Mypy 讓動態語言 Python 擁有靜態類型檢查的能力。經過使用 Python 的類型標註功能,Mypy 可以確保你的變量類型始終如一,始終是你定義的那樣,不會由於中途的某次賦值,把一個列表變成了字符串。
運行效果以下圖所示:
Mypy 能正常識別出相似於字符串與數字相加這種錯誤,不管是直接 hard code 寫的仍是字符串變量加上整型變量。
在代碼中聲明瞭a_list是一個只包含數字的列表,當你傳入一個字符串的時候就會報錯。
關於 Python 的類型標註,能夠閱讀官方文檔:Syntax for Variable Annotations[2]。
總結
若是隻要統一團隊的代碼風格,那麼可使用 Pylint。Pylint 速度比較慢。
若是要檢查代碼中的語法錯誤,可使用 Pyflakes。另有一個項目叫作 Flake8,它至關於 Pyflakes + Pylint 的合體。
若是要對代碼作靜態類型檢查,那麼使用 Mypy。
參考資料
[1]
PEP-8: https://www.python.org/dev/peps/pep-0008/
[2]
Syntax for Variable Annotations: https://www.python.org/dev/peps/pep-0526/
kingname攢錢給產品經理買房。