mypy 找不到模块的实现或库存根

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

我有:

foo/
├── __init__.py
├── bar.py
└── baz
    ├── __init__.py
    └── alice.py

bar.py
中,我导入了 Alice,这是一个空类,除了
name
属性设置为
"Alice"
之外什么都没有。

from baz.alice import Alice

a = Alice()
print(a.name)

运行正常:

$ python foo/bar.py
Alice

但是 mypy 抱怨:

$ mypy --version
mypy 0.910
$ mypy --strict .
foo/bar.py:1: error: Cannot find implementation or library stub for module named "baz.alice"
foo/bar.py:1: note: See https://mypy.readthedocs.io/en/stable/running_mypy.html#missing-imports
Found 1 error in 1 file (checked 6 source files)

mypy 为何抱怨?

python mypy
2个回答
39
投票

mypy 有自己的导入搜索路径,并且不能像 Python 那样完全解析导入,并且无法找到

baz.alice
模块。检查错误消息中列出的文档,特别是有关如何找到导入的部分:

搜索模块

foo
的规则如下:

搜索会在搜索路径中的每个目录中查找(请参阅 上面)直到找到匹配项。

  1. 如果找到名为
    foo
    的包(即包含
    __init__.py
    __init__.pyi
    文件的目录 foo),则表示匹配。
  2. 如果找到名为
    foo.pyi
    的存根文件,则表示匹配。
  3. 如果找到名为
    foo.py
    的 Python 模块,则表示匹配。

文档还在“将文件路径映射到模块”部分中指出了这一点:

对于每个要检查的文件,
mypy

将尝试关联该文件 (例如

project/foo/bar/baz.py
)具有完全限定的模块名称(例如
foo.bar.baz
)。

有几种方法可以解决这个特定问题:

正如 paul41 在他的评论中提到的,解决此问题的一个选择是提供完全限定的导入 (
    from foo.baz.alice import Alice
  1. ),然后从顶级模块(根级别中的
    .py
    文件)运行。
    您可以在导入行中添加 
  2. # type: ignore
  3. 您可以编辑 
  4. MYPYPATH
  5. 变量以指向
    foo
    目录:
    
    
  6. (venv) (base) ➜ mypy foo/bar.py --strict foo/bar.py:3: error: Cannot find implementation or library stub for module named "baz.alice" foo/bar.py:3: note: See https://mypy.readthedocs.io/en/stable/running_mypy.html#missing-imports Found 1 error in 1 file (checked 1 source file) (venv) (base) ➜ export MYPYPATH=foo/ (venv) (base) ➜ mypy foo/bar.py --strict Success: no issues found in 1 source file


0
投票
baz

下面有红色波浪线,问题的根源可能是您没有将

baz
的父文件夹标记为
源根
。当您执行此操作并重新打开项目时,红色波浪线将消失,MyPy 也将能够导入。

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