我们有一个 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
。
这可能吗?
mypy 不支持文件模式,仅在模块限定名称段上使用单个通配符(例如
package_2.*.nested.*
),并且您不能在该段上执行部分名称模式(即不支持 package_2.test_*
)。
考虑以下解决方法之一:
将内联配置
# mypy: disable-error-code=union-attr
添加到出现此错误的测试文件中。
移动您的测试文件,以便 mypy 可以匹配模式。例如,将测试全部转移到
tests/package_tests/
下将允许您添加配置部分
[mypy]
...
[mypy-tests.package_tests.*]
disable_error_code = union-attr
运行 mypy 然后过滤掉错误,然后再报告给另一个工具。如果您认为错误会报告给 STDOUT 并且全部看起来像这样,那么这很容易完成:
package_1/test_package_1.py:123: error: Item "str" of "Union[int, str]" has no attribute "__int__" [union-attr]
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
),但在我看来,这对于您来说是非常费力的事情。正在尝试这样做(您需要编写自己的表达式遍历器类)。