禁用某些与命名模式匹配的文件的特定 mypy 检查

问题描述 投票:0回答:1

我们有一个 python 项目,其中使用 mypy。在我们的项目中,测试文件位于源旁边,而不是单独的测试包。他们的名字遵循以下模式:

test_<module>.py
。像这样的东西:

src/
  package_1/
    __init__.py
    package_1.py
    test_package_1.py
  package_2/
    __init__.py
    package_2.py
    test_package_2.py

在 mypy 中,我想禁用

union-attr
规则,但仅限于所有测试文件。到目前为止,我已经能够对所有文件禁用该规则,或者不对所有测试文件完全运行 mypy。但我想禁用测试文件的
union-attr

这可能吗?

python mypy
1个回答
0
投票

mypy 不支持文件模式,仅在模块限定名称段上使用单个通配符(例如

package_2.*.nested.*
),并且您不能在该段上执行部分名称模式(即不支持
package_2.test_*
)。

考虑以下解决方法之一:

  1. 将内联配置

    # mypy: disable-error-code=union-attr
    添加到出现此错误的测试文件中。

  2. 移动您的测试文件,以便 mypy 可以匹配模式。例如,将测试全部转移到

    tests/package_tests/
    下将允许您添加配置部分

    [mypy]
    ...
    
    [mypy-tests.package_tests.*]
    disable_error_code = union-attr
    
  3. 运行 mypy 然后过滤掉错误,然后再报告给另一个工具。如果您认为错误会报告给 STDOUT 并且全部看起来像这样,那么这很容易完成:

    package_1/test_package_1.py:123: error: Item "str" of "Union[int, str]" has no attribute "__int__"  [union-attr]
    
  4. mypy.plugin.Plugin.get_additional_deps
    钩子使您可以在分析之前访问模块AST,其文件名可以与模式
    test_*.py
    进行匹配。您可以编写一个 mypy 插件,通过在包含属性访问表达式的每一行添加一个假的
    type: ignore[union-attr, unused-ignore]
    来转换 AST(
    mypy.nodes.MemberExpr
    ;另请参阅
    mypy.nodes.MypyFile.ignored_lines
    ),但在我看来,这对于您来说是非常费力的事情。正在尝试这样做(您需要编写自己的表达式遍历器类)。

© www.soinside.com 2019 - 2024. All rights reserved.