Appearance
静态代码检查工具Flake8
Flake8
Flake8 简介
代码规范不仅能减少bug,有助于代码审查,降低维护成本,更重要的是在大型项目中,能够提升团队间的合作效率。
Flake8 是一款辅助检测Python代码是否规范的工具,它是下面三个工具的封装集合:
- PyFlakes
- pycodestyle
- Ned Batchelder's McCabe script
不光对以上三个工具的封装,Flake8 还提供了扩展的开发接口。
Flake8 通过启动单个 flake8
命令来运行所有工具。它在每个文件的合并输出中显示警告。
它还增加了一些功能:
- 跳过此行检测:
text
# flake8:noqa
- 忽略此行特定错误
# noqa: <error>
,例如,# noqa: E234
。可以给出多个错误代码,用逗号分隔。 - Git 和 Mercurial 钩子
- 通过
flake8.extension
和flake8.formatting
入口扩展更多功能
Flake8 安装
在 Ubuntu16.04 安装 Flake8
text
apt-get update
apt-get install python-flake8
在 Windows 安装 Python 之后通过 cmd 命令安装 Flake8
text
python<version> -m pip install flake8
其中,<verison> 代表着 Python 的版本号,通过 python –v 或者 python –version 查看。
当然也可以直接按默认配置安装 Flake8:
python -m pip install flake8
可通过 flake8 –help 查看是否安装成功。
Flake8 使用
通过在终端内输入以下命令
flake8 <project>
错误码类型
Flake8 输出的信息中每一行都会包含一个错误码类型,这里举一些例子,实际需要自己动手操作下
- E***/W***:分别表示 PEP8 中的 error 和 warning;
- F***:通过 PyFlakes 检测出来的 error,其实 PyFlakes 本身是不提供错误返回码的,flake8 对PyFlakes 返回的错误消息进行了分类;
- C9**:通过 McCabe 检测出的代码复杂度。Flake8 提供一个扩展选项:--max-complexity,如果函数的 McCabe 复杂度比给定的值更高将发出一个告警。该功能对于发现代码过度复杂非常有用,根据 Thomas J. McCabe, Sr(Cyclomaticcomplexity的创造者)研究,代码复杂度不宜超过10,而 Flake8 官网建议值为 12。
忽略/展示特定错误
假如静态代码检查中想展示项目下的 H233 特定错误怎么办呢?可以通过 flake8 --select 命令来实现:
flake8 --select H233 <project>
如果需要选择以特定类型开头的错误码,eg:以 E 开头
如果需要选择多个特定错误码用逗号隔开就可以了,eg:错误码1,错误码2。
flake8 --select E <project>
忽略特定错误码
静态代码检查忽略H233类型错误,设定多个忽略方法同上
flake8 --ignore H233 <project>
忽略特定文件/文件夹
静态代码检查忽略test2.py文件,设定多个忽略方法同上
flake8 --exclude project/path2/test2.py <project>
静态代码检查忽略path2整个文件,设定多个忽略方法同上
flake8 --exclude project/path2/project
输出修改格式
flake8 --format=%(path)s::%(row)d,%(col)d::%(code)s::%(text)s shadowtest
自定义配置
假如想把代码复杂度设为其他值,只看几种类型的错误,并且有几个文件夹下的内容不需要检查是不是每次检查都要把上面的设置重新输入一遍?解决如下:配置文件
Flake8 它是支持将个人设定保存在配置文件里面的,我们可以通过以 setup.cfg,tox.ini 或者 .flake8 以上三种文件形式保存配置。
文件内容如下
[flake8]
ignore = D203
exclude = .git,__pycache__,docs/source/conf.py,old,build,dist
max-complexity = 10
配置项列表:
- count 打印错误总数
- diff 仅检查修改的文件并报告 diff 中包含的错误
- exclude 排除,使用逗号分隔
- filename 检查的文件
- format 选择用于向用户显示错误的格式化程序,默认情况下,有两种可用的格式化程序:default 和 pylint
- hang-closing 切换 pycodestyle 是否应该强制匹配左括号行的缩进
- ignore 要忽略的错误代码列表,默认为 E121,E123,E126,E226,E24,E704,W503,W504
- extend-ignore 添加到要忽略的错误代码列表,无需完全覆盖默认列表
- max-line-length 最大长度
- select 希望 Flake8 报告的错误代码列表
- extend-select 添加到要报告错误的代码列表,无需完全覆盖默认列表
- disable-noqa 报告所有错误,即使它与注释在同一行
- show-source 打印生成相关错误/警告的源代码
- statistics 计算每个错误/警告代码的出现次数并打印报告
- enabled-extensions 启用默认关闭扩展
- exit-zero 即使有错误,也强制 Flake8 使用退出状态代码 0
- jobs 指定 Flake8 将用于并行运行检查的子进程数
- output-file 将所有输出重定向到指定的文件
- tee 如果已配置输出文件,还将输出打印到标准输出
- append-config 提供额外的配置文件来解析
- config 配置文件的路径
- isolated 忽略任何配置文件并使用 Flake8
- builtins 提供内置函数、对象、名称等的自定义列表
- doctests 在 docstrings 中启用 doctests 的 PyFlakes 语法检查
- include-in-doctest 指定 PyFlakes 检查哪些文件的 doctest 语法
- exclude-from-doctest 指定 PyFlakes 不检查哪些文件的 doctest 语法
Flake8 插件
Flake8 相比其他 Python 静态代码检查工具的优势在于其良好的扩展性,以下是介绍 Flake8 几款比较流行的插件:
- hacking
由于 Python 是 OpenStack 的官方语言,hacking 则是根据 OpenStack Style Guidelines 所产生,基于原有的 Google Python Style Guide 和 OpenStack 自有规则而形成的。
hacking官方文档:https://pypi.python.org/pypi/hacking
插件安装也非常简单,通过pip安装 hacking,Windows cmd 窗口执行:
python –m pip install
hacking 插件安装完成之后,会新增一类错误返回码以H开头:H***:hacking返回的错误类型。
在hacking中有些错误类型检测是默认关闭的,可以通过命令行或者配置文件修改开关:enable-extensions= H106,H203
- pep8-naming
针对目前 PEP8 尚未支持命名规范的检查,有人开发出了此款插件作为规则补充。
pep8-naming 插件安装完成之后,会新增一类错误返回码以N开头:
N***: pep8-naming 返回的错误类型。
其他插件可以通过命令:pip search flake8 来搜索,肯定有你需要的,安装也非常简单:pip install 插件名称
有些坑先提示一下:
规则检查插件与插件之间,可能会存在重复提示,假如要排除一类则你的配置文件会越来越复杂,并不是安装越多越好,工具不在于过多,而在于会用。
插件与插件之间,尤其是两个新的插件可能无法完美兼容。eg:为了可视化,本人在flake8上面安装了 flake8-chart 0.1.5 这一插件,
通过这一插件将flake8的分析结果转化为图形(只支持饼图和柱状图)。
执行以下命令:
flake8 --statistics <project> | flake8chart--chart-type=BAR --chart-output=demo.svg
- flake8-junit-report
在 Jenkins上分析 Flake8 的报告,在 Flake8 上安装插件,flake8-junit-report 将 Flake8 的报告转换为 junit format,可以通过构建后操作 Publish Junit testresult repor t能不能输出文档:
安装flake8-junit-report
pip install flake8-junit-report
输出Flake8测试报告
flake8 --output-file flake8.txt shadowtest
转换成junit测试结果的xml
6ython -m junit_conversor flake8.txt flake8_junit.xml
转换成junit.xml报告
在Jenkins上面展示: