我尝试将 MyPy 与使用 ruamel.yaml 的模块一起使用,并且 Mypy 无法找到 ruamel.yaml,即使 Python 找到它没有问题。我很困惑,因为我找不到名为 YAML.py 的模块或名为 YAML 的类,即使这些语句在 Python 中工作:
from ruamel.yaml import YAML
yaml = YAML()
x = yaml.load()
我需要做什么才能让 MyPy 识别 ruamel.yaml?
解决方法是在没有 mypy 增量逻辑的情况下运行:
python -m mypy --no-incremental myfile.py
背景
mypy 中有一个已知问题,请参阅此处。
总结:
当 mypy 遇到
ruamel
时,有些东西与增量逻辑不兼容。
运行一次后,一切正常。这是命令:
python -m mypy myfile.py
然后,当你再次运行时,你会得到一个错误:
error: Skipping analyzing 'ruamel': found module but no type hints or library stubs [import]
然后,当你再次运行时,一切就OK了
等等
您不应该寻找文件
YAML.py
。 中的
YAML
yaml = YAML()
是在
ruamel/yaml/main.py
中定义的类,并导入到 ruamel/yaml/__init__.py
中(均在站点包下)。这就是你这样做的原因:
from ruamel.yaml import YAML
(另一种方法是在目录
yaml.py
下有一个文件ruamel
,但是加载器/转储器有点太多了,无法放在一个文件中)。
如果上述知识不能帮助您解决问题,那么显式地 设置全局标志 mypy_path 或环境变量
MYPYPATH
可能会起作用。这必须包括目录 ruamel
所在的目录。
(我在文档中找不到它,但是从源代码(
mypy/build.py:mypy_path()
)中你可以看到这应该是一个在os.pathsep
(这是冒号(:
))上分割的字符串我的基于 Linux 的系统))
我也有同样的问题。
即使设置 MYPYPATH=./.venv/lib/python3.7/site-packages 后
临时“解决方案”是忽略缺少的导入异常
mypy --忽略缺失导入
根据票7276,添加
--no-incremental
即可解决问题。
(我测试过,它确实解决了我的环境中的问题。)