当你运行Flake8时会发生什么

鉴于 Flake8 3.0的新的组织和结构,对于一些人来说,当你打电话给你时,可能会有点难以理解 flake8 在命令行上执行。本节旨在为您提供一些技术性的概述,了解具体发生了什么。

调用

我们最终在 main Flake8的函数取决于如何调用它。如果你做一些类似的事情:

flake8

然后你的壳向上看 flake8 可执行文件将其保存并执行。在几乎每种情况下,这都是由 setuptools 使用控制台脚本入口点 Flake8 在其 setup.py . 这可能看起来像:

#!/path/to/python<version>
# EASY-INSTALL-ENTRY-SCRIPT: 'flake8==3.0.0','console_scripts','flake8'
__requires__ = 'flake8==3.0.0'
import sys
from pkg_resources import load_entry_point

if __name__ == '__main__':
    sys.exit(
        load_entry_point('flake8==3.0.0', 'console_scripts', 'flake8')()
    )

如果你调用它的方式是:

python -m flake8

那么你就要依靠Python来找到 flake8.__main__ 然后跑过去。然而,在这两种情况下,你最终都会 flake8.main.cli.main() . 这是用户最终启动Flake8的主要方式。此函数用于创建 Application .

通过Setuptools

如果你在调用 Flake8 从你 setup.py 然后你就真的在 flake8.main.setuptools_command.Flake8.run() . 然后收集包信息中包含的文件并创建 Application .

通过Git或Mercurial

在这两种情况下,他们各自打电话 hook 创建实例的函数 Application .

应用程序逻辑

当我们创造 Application 实例中,我们记录开始时间并解析命令行参数,以便可以配置 Flake8 的日志记录。在大多数情况下,每一条路都会调用 run() 反过来又叫:

然而,我们的Git钩子单独运行这些。

应用程序初始化

initialize() 我们所有的货物 plugin 注册这些插件的选项,解析命令行参数,生成格式化程序(由用户选择),使 StyleGuide 最后让我们 file checker manager .

检查我们的支票

run_checks() then creates an instance of flake8.checker.FileChecker for each file to be checked after aggregating all of the files that are not excluded and match the provided file-patterns. Then, if we're on a system that supports multiprocessing and flake8 --jobs is either auto or a number greater than 1, we will begin processing the files in subprocesses. Otherwise, we'll run the checks in parallel.

在我们开始运行检查之后,我们开始聚合报告的 violation 在主过程中。检查完成后,我们记录结束时间。

举报违规行为

接下来,应用程序从文件检查器管理器获取冲突,并通过 StyleGuide . 这依赖于 DecisionEngine 实例来确定 error code 被选中或忽略,然后适当地将其发送到格式化程序(或不发送)。

报告基准

最后,如果用户要求查看基准(即。, flake8 --benchmark )然后我们打印基准。

退出

一次 run() 结束后,我们再打电话 exit() 它查看报告了多少错误以及用户是否指定了 flake8 --exit-zero 并使用相应的退出代码退出。