我有:
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 为何抱怨?
mypy 有自己的导入搜索路径,并且不能像 Python 那样完全解析导入,并且无法找到
baz.alice
模块。检查错误消息中列出的文档,特别是有关如何找到导入的部分:
对于每个要检查的文件,搜索模块
的规则如下:foo
搜索会在搜索路径中的每个目录中查找(请参阅 上面)直到找到匹配项。
- 如果找到名为
的包(即包含foo
或__init__.py
文件的目录 foo),则表示匹配。__init__.pyi
- 如果找到名为
的存根文件,则表示匹配。foo.pyi
- 如果找到名为
的 Python 模块,则表示匹配。foo.py
mypy
将尝试关联该文件 (例如
)具有完全限定的模块名称(例如project/foo/bar/baz.py
)。 有几种方法可以解决这个特定问题:foo.bar.baz
正如 paul41 在他的评论中提到的,解决此问题的一个选择是提供完全限定的导入 (
from foo.baz.alice import Alice
.py
文件)运行。您可以在导入行中添加 # type: ignore
MYPYPATH
foo
目录:
(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