Python常用静态代码检查工具

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

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

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

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

PEP8 / pycodestyle

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

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

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

安装

$ pip install pep8

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

$ pep8 gkcx.py 
/ usr / local / lib / python3。5 /dist-packages/pep8.py:2124:UserWarning:

PEP8已更名为pycodestyle(GitHub的问题#466)
的PEP8工具的使用将被删除将来的版本。
请安装并使用`pycodestyle`代替。

$ pip install pycodestyle 
$ pycodestyle ...

  '\ n \ n'

意思是pep8已被pycodestyle替代!

使用

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

$ pycodestyle gkcx.py 
gkcx.py:1180:E501线太长(135 > 79个字符)
gkcx.py:141:E302预期2个空行,发现1个
 gkcx.py:1580:E501线太长(94 > 79个字符)
...部分省略
gkcx.py:671:E305预期2类或后空白行函数定义,发现1
 gkcx.py:7180:E501线太长(100 > 79个字符)
gkcx.py:8225:E231后缺失空白''
 gkcx.py:8229:E231丢失后空白''
 gkcx.py:841:W293空白行包含空格
gkcx.py:841:在文件末尾W391空白行
  • 参数--statistics -qq:对结果进行汇总
$ pycodestyle gkcx.py --statistics -qq 
3        E203前面空格':' 
1        E225在运算符
16周围缺少空格      E231在':'后丢失空格
3:        E302预计有2个空白行,找到1 
1        E305预期2个空行后类或功能定义,发现1 
6        E501行太长(135 > 79个字符)
1        W291尾随空格
1        W293空行包含空格
1       W391文件末尾的空白行
  • 参数--show-source:更详细的输出
$ pycodestyle gkcx.py --show源
gkcx.py:141:E302预期2个空行,发现1
 DEF get_school_id(school_name):
^ 
gkcx.py:1580:E501线太长(94 > 79个字符)
    的Referer = “https://gkcx.eol.cn/soudaxue/queryschool.html?&keyWord1= {}” .format(school_name)
                                                                               ^ 
gkcx.py:1819:前E203空白':' “messtype” : jsonp“
        
                  ^ 
gkcx.py:1912:E231后缺少空白':' “_” “1530074932531”            ^ ...省略部分
        


  • 参数--ignore:忽略指定输出
$ pycodestyle gkcx.py --ignore = E225,E501,E231 
gkcx.py:141:E302预期2个空行,发现1
 gkcx.py:1819:前E203空白':'
 gkcx.py:2019:前E203空白':'
 gkcx.py:2119:前E203空白':'
 gkcx.py:321:E302预期2个空行,发现1个
 gkcx.py:411:E302预期2空白行,发现1个
 gkcx.py:5515:W291尾随空白
gkcx.py:671:E305预期2类或后空白行函数定义,发现1个
 gkcx.py:841:W293空白行包含空格
gkcx.py:841:在文件末尾W391空白行

错误码含义

  • E...:错误
  • W...:警告
  • 100型:缩进问题
  • 200型:空格问题
  • 300型:空行问题
  • 400型:导入问题
  • 500型:行长度问题
  • 600型:已弃用
  • 700型:声明问题
  • 900型:语法错误

Pyflakes

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

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

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

安装

pip安装pyflakes

使用

$ pyflakes [ file name or directory name]

$ pyflakes gkcx.py
gkcx.py:3:'bs4.BeautifulSoup'导入但未使用
gkcx.py:6:'重新'导入但未使用

pylint的

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

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

安装

$ pip install pylint

$ pylint --version 
pylint 2.00
 astroid 2.01
 Python 3.52(默认,2017年 11月23  163701
[GCC 5.40  20160609 ]

使用

基本使用:pylint [options] module_or_package

$ pylint的gkcx.py 
*************模块gkcx 
gkcx.py:110:C0301:行太长(135 / 100)(线太长)
gkcx.py:2547:C0326:正是所需的一个空间逗号之后
    响应= requests.request(“GET”,data_url,标头=报头,则params =参数)
                                               ^(坏空白)
gkcx.py:360:C0301:行太长(113 / 100)(线太长)
gkcx.py:10:C0111:缺少模块文档字符串(缺文档字符串)
gkcx.py:100:C0103:常量名“头”没有按“T符合UPPER_CASE命名风格(无效名)
......部分省略
gkcx.py:14: 18:W0621:从外部范围重新定义名称' school_name '(第68行)(重新定义的外部名称)
gkcx.py:32:0:C0111:缺少函数docstring(missing-docstring)
gkcx.py:33:4:W0622 :重新定义内置' id '(重新定义内置)
gkcx.py:32:12:W0621:从外部范围重新定义名称' school '(第72行)(redefined-outer-name)

-------------------------------------------------- ---------------- 
您的代码已被评为3.33 / 10(之前的运行:3.33 / 10,+ 0.00)

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

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

错误代码含义

  • C:惯例,违反了编码风格标准
  • R:重构,代码非常糟糕
  • W:警告,某些Python特定的问题
  • E:错误,很可能是代码中的错误
  • F:致命错误,阻止Pylint进一步运行的错误

flake8

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

  1. PyFlakes:静态检查Python 代码逻辑错误的工具。
  2. Pep8:静态检查PEP8 编码风格的工具。
  3. NedBatchelder的McCabe:静态分析Python 代码复杂度的工具。

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

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

安装

$ pip install flake8       

$ flake8 --version
3.5.0(mccabe:0.6.1,pycodestyle:2.3.1,pyflakes:1.6.0)Linux上的CPython 3.5.2

使用

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

$ flake8 gkcx.py 
gkcx.py:31:F401 'bs4.BeautifulSoup'但未使用的导入
gkcx.py:61:F401 '重新'但未使用的导入
gkcx.py:1180:E501线太长(135 > 79个字符)
gkcx.py:141:E302预期2个空行,发现1
 ...部分省略
gkcx.py:7180:E501线太长(100 > 79个字符)
gkcx.py:8225:E231后缺失空白''
:gkcx.py 8229:E231后缺失空白''
 gkcx.py:841:W293空白行包含空格
gkcx.py:841:W391空白行在文件的末尾

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

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

  • McCabe复杂度默认情况下是不会输出的,需要通过--max-complexity指定:
$ flake8 gkcx.py --max复杂度= 5
 gkcx.py:31:F401 'bs4.BeautifulSoup'但未使用的导入
gkcx.py:61:F401 '重新'但未使用的导入
...省略部分
gkcx的.py:671:E305预期2类或后空白行函数定义,发现1个
 gkcx.py:671:C901 '如果67'是过于复杂(6
gkcx.py:7180:E501线太很长(100> 79个字符)
gkcx.py:8225:E231后缺失空白''
 gkcx.py:8229:后E231缺失空白''
:gkcx.py 841:W391空白线在文件末尾
gkcx .py:841:W293空行包含空格
  • 通过可以--ignore忽略指定输出:
$ flake8 gkcx.py --ignore E501,E231,E203 
gkcx.py:31:F401 'bs4.BeautifulSoup'但未使用的导入
gkcx.py:61:F401 '重新'但未使用的导入
gkcx.py:141:E302预期2个空行,发现1个
 gkcx.py:321:E302预期2个空行,发现1个
 gkcx.py:3822:E225周围操作者缺少空白
gkcx.py:411:E302预期2个空行,发现1个
 gkcx.py:5515:W291尾随空白
gkcx.py:671:E305预期2类或后空白行函数定义,发现1个
 gkcx.py:841:在W391空白行文件尾
gkcx.py:841:W293空白行包含空格
  • 通过--select参数设置只展示指定输出:
$ flake8 gkcx.py --select F401 
gkcx.py:31:F401 'bs4.BeautifulSoup'但未使用的导入
gkcx.py:61:F401 '重新'但未使用的导入

错误码含义

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

  • E***W***:PEP8中的错误和警告。
  • F***:通过PyFlakes检测出的错误,其实PyFlakes本身是不提供错误返回码的,flake8对pyflakes返回的错误消息进行了分类。
  • C9**:通过McCabe检测出的代码复杂度。

总结

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

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

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

未经允许不得转载:技术啦 - 关注IT,建站和运维,分享最新教程,资源 » Python常用静态代码检查工具

赞 (0) 打赏

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址