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攒钱给产品经理买房。

相关文章
相关标签/搜索