摄影:产品经理黄金炒饭配麻婆豆腐
说到 Python 的静态分析工具,就不得不说Pylint、Pyflakes 和 Mypy。他们的作用有重叠的地方,但又有各自的侧重点。在某些时候你可以只选择其中一个来用,有时候你又需要把他们结合起来使用。
Pylint:让你的代码符合 PEP-8风格
PEP-8[1]是 Python 的官方编码风格指导。我们平时常常说到的:
- 函数名、变量名使用小写字母和下划线,类名使用驼峰命名法
- 缩进使用4个空格
- 运算符、赋值符号左右侧都要有空格,冒号右侧有空格左侧没有空格
- 多行字符串用三对单引号,但是 docstring 用三对双引号
- ……
这些都是PEP-8中明确建议的编码风格。
Pylint 主要的功能就是用于编码风格的检验,在默认情况下 Pylint 会以 PEP-8为标准,如果你写的代码不符合 PEP-8编码规范,它就会给你报错。
如下图所示:
通过修改 pylint 的配置文件,可以修改它检查的方式,从而使它遵守其他的编码规范,例如你们团队大部分人是从 Java 转到 Python 的,那么可以强行让变量名函数名都变成驼峰命名法。
使用 Pylint 方便团队形成统一的编码规范。
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。