如何通过tox为项目测试目录应用差异化flake8规则?
我之前也碰到过一模一样的情况——当tox.ini里包含[flake8]配置时,子目录的.flake8确实会被忽略,这是因为flake8的配置加载优先级里,tox.ini的[flake8] section优先级高于子目录的配置文件。不过有几种实用方法可以实现你要的“测试目录单独忽略E402”的需求:
方案1:使用flake8的per-file-ignores全局配置(推荐)
这是最简洁的方式,直接在tox.ini的[flake8] section里针对测试文件设置忽略规则,不需要单独的子目录配置文件:
修改你的./tox.ini中的[flake8]部分:
[flake8] count = true statistics = True per-file-ignores = tests/**/*.py: E402
这个配置会告诉flake8:对tests目录下所有.py文件忽略E402规则,其他文件沿用全局配置。
方案2:在tox的lint命令中拆分flake8调用
如果你想保留子目录的.flake8文件,可以把flake8的执行拆成两个命令,分别处理主模块和测试目录,并为测试目录指定配置文件:
修改./tox.ini中[testenv:lint]的commands:
[testenv:lint] basepython = python3 ignore_errors = True deps = -r{toxinidir}/requirements_test.txt commands = flake8 myModule # 使用tox.ini中的flake8配置处理主模块 flake8 tests --config=tests/.flake8 # 加载tests目录的专属配置 pylint myModule pydocstyle myModule tests
这样两个flake8实例分别使用不同的配置,互不干扰。
方案3:移除tox.ini中的[flake8]配置,让flake8自动加载子目录配置
如果你不想在tox.ini里写flake8配置,可以把[flake8] section移到项目根目录的.flake8文件中,然后保留tests/.flake8。此时tox的lint命令只需要调用flake8 myModule tests,flake8会自动为不同目录加载对应的配置文件:
- 项目根目录创建
.flake8:
[flake8] count = true statistics = True
- 保留
./tests/.flake8的配置:
[flake8] ignore = E402
- 修改tox.ini的[testenv:lint],移除原有的[flake8] section:
[tox] envlist = lint, py27, py36 [testenv] commands = coverage run --source=myModule -a setup.py test [testenv:lint] basepython = python3 ignore_errors = True deps = -r{toxinidir}/requirements_test.txt commands = flake8 myModule tests pylint myModule pydocstyle myModule tests
这种方式依赖flake8的自动配置查找机制,它会为每个目录加载就近的.flake8文件。
为什么之前的配置不生效?
核心原因是flake8的配置加载优先级:命令行参数 > tox.ini中的[flake8] > 根目录.flake8 > 子目录.flake8。当tox.ini里存在[flake8] section时,它会覆盖所有子目录的配置文件,所以你的tests/.flake8会被忽略。
内容的提问来源于stack exchange,提问作者mpounsett

