高质量的代码不仅提高了软件的可维护性和可读性,还减少了错误和漏洞,从而提升了软件的可靠性和安全性。
众所周知,PEP 8
规范是 Python 社区制定的一份关于代码格式和风格的优秀指南。Flake8 为此而生。
概念
Flake8 是一个广泛使用的 Python 代码质量检查工具,它结合了多个流行的静态代码分析工具,为开发人员提供了全面的代码检查功能。Flake8 的核心组件包括:
- PyFlakes:检测代码中的错误,例如未使用的变量或未定义的名称。
- pycodestyle (原名 PEP8):检查代码是否符合 PEP 8,即 Python 的官方编码规范。
- McCabe:计算代码的圈复杂度,帮助开发人员识别复杂度过高的函数和方法。
为何要装
- 保持代码的一致性和可读性
- 发现代码中的潜在错误和问题
- 让代码遵循 Python 编码规范(PEP 8)
安装和配置
pip
安装
pip install flake8
接下来,在项目根目录创建.flake8
配置文件,如:
[flake8]
max-line-length = 88
exclude =
.git,
__pycache__,
old,
build,
dist
ignore = E501,W503
上述ini代码配置中:
-
max-line-length = 88
表示设置了代码行的最大长度限制为 88 字符。如果代码行超过这个长度,Flake8 将报告一条错误信息。这个值不同于默认的 79 字符,通常是为了与其他工具(如black
格式化器)保持一致。 -
exclude
这一项指定了 Flake8 在进行代码检查时要排除的目录列表。配置中的这些目录将不会被 Flake8 检查,比如例子就排除了.git
、__pycache__
、old
、build
、dist
这几个目录。 -
ignore = E501,W503
则选项用于指定 Flake8 在进行代码检查时应忽略的错误和警告类型。这里忽略了两种特定的错误和警告
检查代码
配置之后,就可以使用flake8进行检查代码质量,
单个文件
flake8 your_script.py
整个项目
flake8 .
其实还可以这样临时指定参数运行,这里命令行参数会覆盖掉上面的.flake8
文件里的配置参数
flake8 --ignore=E501,W503 your_script.py
输出解读
在执行完flake8命令后,比如检查这段代码:
def my_function():
print("Hello, World!")
print("This line is too long, it exceeds the maximum line length recommended by PEP 8.")
我们可能看到类似这样的错误或告警的输出
example.py:3:1: E305 expected 2 blank lines after class or function definition, found 1
example.py:4:80: E501 line too long (86 > 79 characters)
这些错误/告警提示,都是在指导你怎么把代码写的更加PEP 8规范化,提示也是比较明显了。
更多错误可以参考这个PEP 8文档:
https://pep8.readthedocs.io/en/latest/intro.html#error-codes
忽略规则
在 Flake8 中,除了通过在.flake8
配置文件中指定文件或文件夹外,它还提供了使用特定的注释来告诉 Flake8 在代码中忽略特定行的检查。这些注释称为 "Flake8 noqa comments"。
在代码中插入 # noqa
注释可以告诉 Flake8 忽略该行的检查。这在某些情况下很有用,例如当你知道某一行违反了规范,但你有充分的理由保留它时(尤其是一些比较急的热修复时)。
全局禁用
# flake8: noqa
import os # noqa
在这个例子中,# flake8: noqa
告诉 Flake8 忽略整个文件的检查,而 # noqa
注释告诉 Flake8 忽略 import os
这一行的检查。
特定禁用
import os # noqa: F401
在这个例子中,# noqa: F401
告诉 Flake8 忽略 import os
这一行的 F401 错误(未使用的导入)
检查。
注意事项
尽量减少使用 # noqa
注释,它们应该只在确实需要的情况下使用,并且要确保有充分的理由来禁用检查,否则会导致漏检查引发隐藏问题。
集成到工作流
- 在 IDE/编辑器中集成 Flake8(如 VSCode、PyCharm),这样在写代码的时候就能注意到问题
- 在 CI/CD 管道中使用 Flake8, 比如在
GitHub Actions
中使用 Flake8
name: Flake8 Lint
on: [push, pull_request]
jobs:
flake8:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v2
- name: Set up Python
uses: actions/setup-python@v2
with:
python-version: '3.x'
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install flake8
- name: Run Flake8
run: |
flake8 .
这样就能保证合并到仓库的代码是统一规范的。
插件
Flake8 还提供了其他优秀插件扩展功能,比如flake8-docstrings
可以帮我们进行一些文档字符串检查(如函数/类/模块是否有文档注释等)
总结
Flake8 是 Python 开发中常用的代码质量检查工具,通过集成多个静态分析工具,帮助开发者确保代码符合PEP 8
规范,代码更加漂亮优雅,提高可读性和一致性,提高了团队开发的效率。