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