如何让mypy在无父包时跳过相对导入?为何# type: ignore无效?
为何mypy的“无父模块”错误无法用
# type: ignore忽略? 这是因为mypy的错误分两种层级:
- 一类是类型检查相关错误,比如类型不匹配、未定义变量这类,
# type: ignore只能处理这类错误。 - 另一类是模块结构/语法层面的致命错误,你遇到的「No parent module -- cannot perform relative import」就属于这类。这类错误是mypy在初始化模块分析阶段就触发的,会直接中断后续的类型检查流程,
# type: ignore注释根本没机会生效。
结合你的场景来看:
当前目录没有__init__.py,mypy会把foo.py判定为顶级脚本模块,而相对导入(from . import ...)只能在包内模块中使用——这种写法在脚本模式下本身就不符合Python的模块规则,mypy会直接判定它无效,不会进入后续的类型检查环节,自然无视你加的忽略注释。
可行的解决办法:
- 在当前目录添加空的
__init__.py,让mypy把该目录识别为Python包,此时相对导入的写法就合法了,错误会自动消失。 - 替换相对导入为绝对导入,直接写
import bar,避免这种依赖包结构的写法。 - 在mypy配置文件(比如
mypy.ini)中添加mypy_path = .,指定当前目录为模块搜索根目录,让mypy正确识别模块结构。
内容的提问来源于stack exchange,提问作者MHStag
相关产品推荐
相关产品推荐

