Py学习  »  Python

Python 常用静态代码检查工具

不正经程序员 • 5 年前 • 732 次点击  
不正经开场白

对于我这种习惯了 Java 这种编译型语言,在使用 Python 这种动态语言的时候,发现错误经常只能在执行的时候发现,总感觉有点不放心。

而且有一些错误由于隐藏的比较深,只有特定逻辑才会触发,往往导致需要花很多时间才能将语法错误慢慢排查出来。其实有一些错误是很明显的,假如能在写程序的时候发现这些错误,就能提高工作效率。

这时候 Python 静态语法检查工具就出现了。

本文使用之前文章 Python 助你填写高考志愿 中的代码作为测试代码。另外有些输出过长的,进行了截取。

1  pep8 / pycodestyle

相信大家多多少少都见过 PEP 8,那 PEP 8 到底是个啥?

其实 PEP 8 是一种 Python 代码规范指南,可以参阅官网:https://www.python.org/dev/peps/pep-0008/,其目的是为了保持代码的一致性、可读性。

检查自己代码是否符合 PEP 8 规范,一个简单的工具就是:pep8。

1.1 安装

$ pip install pep8

在使用时发现 pep8 给出了一个警告:

意思是 pep8 已被 pycodestyle 替代!那我们就用 pycodestyle 好了,反正用法一样的~

1.2 使用

$ pycodestyle [file name or directory name]

  • --statistics -qq  :对结果进行汇总

  • --show-source :更详细的输出

  • --ignore :忽略指定输出

1.3 错误码含义

  • E*** :错误

  • W*** :警告

  • 10* :缩进问题

  • 20* :空格问题

  • 30* :空行问题

  • 40* :导入问题

  • 50* :行长度问题

  • 60* :已弃用

  • 70* :声明问题

  • 90* :语法错误

2  Pyflakes

一个用于检查 Python 源文件错误的简单程序。

Pyflakes 分析程序并且检查各种错误。它通过解析源文件实现,无需导入它,因此在模块中使用是安全的,没有任何的副作用。

  • 不会检查代码风格

  • 由于它是单独检查各个文件,因此它也相当的快,当然检测范围也有一定的局限

2.1 安装

pip install pyflakes

2.1 使用

$ pyflakes [ file name or directory name]

我倒是挺喜欢 Pyflakes 的,因为我自己的代码有自己的风格,你只要给我检查错误就行了,哈哈~

3  Pylint

PyLint 是 Python 源代码分析器,可以分析 Python 代码中的错误,查找不符合代码风格标准和有潜在问题的代码,是一个可以用于验证多个文件的模块和包的工具。

缺省情况下,PyLint 启用许多规则。它具有高度可配置性,从代码内部处理程序控制它。另外,编写插件添加到自己的检查中是可能的。

3.1 安装

$ pip install pylint$ pylint --versionpylint 2.0.0astroid 2.0.1Python 3.5.2 (default, Nov 23 2017, 16:37:01)[GCC 5.4.0 20160609]

3.2 使用

pylint [options] module_or_package

发现 Pylint 还会给代码整体打一个分数,我们就可以根据提示一步步调优,提高分数!10 分满分。

如果运行两次 Pylint,它会同时显示出当前和上次的运行结果,从而可以看出代码质量是否得到了改进。

3.3 错误代码含义

  • C :惯例,违反了编码风格标准

  • R :重构,代码非常糟糕

  • W :警告,某些 Python 特定的问题

  • E :错误,很可能是代码中的错误

  • F :致命错误,阻止 Pylint 进一步运行的错误

4  flake8

Flake8 是由 Python 官方发布的一款辅助检测 Python 代码是否规范的工具,相对于目前热度比较高的 Pylint 来说,Flake8 检查规则灵活,支持集成额外插件,扩展性强。Flake8 是对下面三个工具的封装:

  1. PyFlakes:静态检查 Python 代码逻辑错误 的工具。

  2. Pep8: 静态检查 PEP8 编码风格 的工具。

  3. NedBatchelder’s McCabe :静态分析 Python 代码复杂度 的工具。

不光对以上三个工具的封装,Flake8还提供了扩展的开发接口。

官方文档:https://pypi.python.org/pypi/flake8/

4.1 安装

4.2 使用

基本使用方法:flake8 [file name or directory name]

PyFlakes 和 Pep8 的输出将合并起来一起返回。可以看出 flake8 不止检查代码错误,还会对代码规范不对的地方进行检查,比如:一行代码过长。

Flake8 提供一个扩展选项:--max-complexity,如果函数的 McCabe 复杂度比给定的值更高将发出一个告警。该功能对于发现代码过度复杂非常有用,根据 Thomas J. McCabe, Sr 研究,代码复杂度不宜超过 10,而 Flake8 官网建议值为 12。

  • McCabe 复杂度默认情况下是不会输出的,需要通过 --max-complexity  指定:

  •  --ignore  忽略指定输出:

  • --select  设置只展示指定输出:

4.3 错误码含义

Flake8 基础错误返回码一共有三类:

  • E*** / W*** :PEP8 中的 error 和 warning。

  • F*** :通过 PyFlakes 检测出的 error,其实 PyFlakes 本身是不提供错误返回码的,flake8 对 pyflakes 返回的错误消息进行了分类。

  • C9** :通过 McCabe 检测出的代码复杂度。

总结

Python 静态代码检查工具不止这几个,大家可以挑选合适的进行使用。本人也没有进行深入地探究,有兴趣进行高阶使用的可以参照官网。

另外,各个工具应该都有对应的插件,比如 vim、vscode、eclipse、pycharm 上应该都能集成上述工具,大家可以网上找下适合自己 ide 的插件进行安装。

有些人估计看到那么多异常也会烦,但是毕竟是可以培养大家代码规范的,后续工作后,肯定也有相应的代码规范,建议大家养成习惯。

对了,那个哲人就是我。

END
推荐阅读

我的 Python 学习资源分享

你还在用 format 格式化字符串?

Python 玩转 Excel

Python 爬虫闯关(第一关)

Python 爬虫闯关(第二关)

Python 爬虫闯关(第三关)


今天看啥 - 高品质阅读平台
本文地址:http://www.jintiankansha.me/t/yXqNDSsKbh
Python社区是高质量的Python/Django开发社区
本文地址:http://www.python88.com/topic/21534
 
732 次点击