我安装了一个"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.py
Python文件代替存根文件,并且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
使用。