Python 静态分析Pylint、Pyflakes 与 Mypy ——我应该用谁?

Python 静态分析Pylint、Pyflakes 与 Mypy ——我应该用谁?
Python 静态分析Pylint、Pyflakes 与 Mypy ——我应该用谁?

摄影:产品经理
黄金炒饭配麻婆豆腐
说到 Python 的静态分析工具,就不得不说Pylint、Pyflakes 和 Mypy。他们的作用有重叠的地方,但又有各自的侧重点。在某些时候你可以只选择其中一个来用,有时候你又需要把他们结合起来使用。

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 ——我应该用谁?

通过修改 pylint 的配置文件,可以修改它检查的方式,从而使它遵守其他的编码规范,例如你们团队大部分人是从 Java 转到 Python 的,那么可以强行让变量名函数名都变成驼峰命名法。

使用 Pylint 方便团队形成统一的编码规范。

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

上一篇:python-Pyflakes pep8在正常模式下检查vim


下一篇:jQuery——jQuery动画