如何配置myypy以忽略特定模块的存根文件?



我安装了一个"dnspython"安装包"pip安装dnspython"在Ubuntu 22.10下做了一个简短的脚本:

#!/usr/bin/env python3
import dns.zone
import dns.query
zone = dns.zone.Zone("example.net")
dns.query.inbound_xfr("10.0.0.1", zone)
for (name, ttl, rdata) in zone.iterate_rdatas("SOA"):
serial_nr = rdata.serial

当我用mypy(0.990版本)检查这个代码片段时,它报告了第7行的error: Module has no attribute "inbound_xfr" [attr-defined]

根据mypy文档,如果Python文件和存根文件都存在于搜索路径上的同一目录中,则只使用存根文件。在"dnspython"的情况下,存根文件query.pyi存在于dns包中,并且存根文件确实没有属性"inbound_xfr"当我重命名或删除存根文件时,则使用query.pyPython文件代替存根文件,并且mypy不再抱怨缺少属性。

我猜这是一个"dnspython"错误吗?是否有一种方法告诉我的query模块,存根文件应该被忽略?

我建议只忽略特定的错误行,而不是整个模块。

dns.query.inbound_xfr("10.0.0.1", zone)  # type: ignore[attr-defined]

这将抑制在该行生成的attr-defined错误消息。如果您打算采用这种方法,我还建议使用--warn-unused-ignores标志运行myypy,它将报告任何冗余和未使用的# type: ignore语句(例如,在更新库之后)。

是否有办法告诉我,查询模块,存根文件应该被忽略?

。存根文件优先于模块。即使您将存根文件的整个路径传递给--exclude,它仍然会看到它。

您想禁用专门为定义创建的语言结构,这看起来不太合乎逻辑。

我猜这是一个"dnspython"错误吗?

是的。

首先,有一个选项--exclude PATTERN来忽略要检查的文件或目录。

根据该文档,您应该使用--follow-imports选项来跳过mypy检查的导入模块:

特别地,——exclude不影响mypy的import following。

您可以使用每个模块的follow_imports配置选项来额外避免mypy跟踪导入并检查您不希望被检查的代码。

另一种方法是,您可以在特定目录中配置Stub文件,并由export MYPYPATH使用。

最新更新