当你运行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
并使用相应的退出代码退出。