Python 靜態分析Pylint、Pyflakes 與 Mypy ——我應該用誰?

Python 靜態分析Pylint、Pyflakes 與 Mypy ——我應該用誰?
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編碼規範,它就會給你報錯。編碼

以下圖所示:
Python 靜態分析Pylint、Pyflakes 與 Mypy ——我應該用誰?3d

經過修改 pylint 的配置文件,能夠修改它檢查的方式,從而使它遵照其餘的編碼規範,例如大家團隊大部分人是從 Java 轉到 Python 的,那麼能夠強行讓變量名函數名都變成駝峯命名法。code

使用 Pylint 方便團隊造成統一的編碼規範。blog

Pyflakes: 代碼邏輯和語法檢查
若是你使用的 Vim 或者記事原本寫代碼,那麼能夠用 Pyflakes 來檢查代碼是否是有語法錯誤或者邏輯錯誤。文檔

Pyflakes 不會檢查代碼的風格,因此上面被 Pylint 報了一大堆錯的文件,用 Pyflakes 來檢查,它只會報三個錯:
Python 靜態分析Pylint、Pyflakes 與 Mypy ——我應該用誰?字符串

也就是變量定義了可是沒有使用。

但若是有語法錯誤,那麼 Pyflakes 就能成功發現:
Python 靜態分析Pylint、Pyflakes 與 Mypy ——我應該用誰?

須要注意的是,因爲 Pyflakes 是靜態分析的工具,因此對於像'1' + 1這種異常是沒法檢查出來的。

Mypy:靜態類型檢查器
Mypy 讓動態語言 Python 擁有靜態類型檢查的能力。經過使用 Python 的類型標註功能,Mypy 可以確保你的變量類型始終如一,始終是你定義的那樣,不會由於中途的某次賦值,把一個列表變成了字符串。

運行效果以下圖所示:
Python 靜態分析Pylint、Pyflakes 與 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/
Python 靜態分析Pylint、Pyflakes 與 Mypy ——我應該用誰?

kingname攢錢給產品經理買房。

相關文章
相關標籤/搜索