兄弟包导入和 mypy "has no attribute" 错误

Sibling package import and mypy "has no attribute" error

我正在尝试从 Python 中的同级包导入模块;按照 this answer 中的说明进行操作。我的问题是导入有效...但是 mypy 说这是一个错误的导入。我想了解为什么 mypy 报告错误,以及如何修复它。

目录structure/Code

这是我用 python -m pip install -e . 成功安装的模块。我知道它已安装,因为它在我 运行 pip freeze 时列出,并且当我打印出来时项目根目录在 sys.path 中列出。

mypackage
├── mypackage 
│   ├── foo 
│   │   ├── __init__.py
│   │   └── db.py
│   ├── bar 
│   │   ├── __init__.py
│   │   └── model.py
│   └── py.typed
└── setup.py

在db.py中:

from mypackage.bar import model

在model.py中:

class MyClass:
  # implementation irrelevant

错误信息

当我 运行 mypy (mypy mypackage 来自项目基目录) 时,我得到以下错误:

mypackage/foo/db.py:7: error: Module 'mypackage.bar' has no attribute 'model'

让我困惑的是,当我打开IDLE时,下面的imports/runs就好了:

>>> from mypackage.bar import model
>>> model.MyClass
<class 'mypackage.bar.model.MyClass'>

我的问题

为什么 mypy 在导入实际有效时在这里显示错误?我怎样才能让 mypy 识别导入有效?

运行 带有 --namespace-packages 标志的 mypy 使检查 运行 没有错误,这使我指出了实际问题:./mypackage/mypackage/__init__.py 不存在,导致 mypy 不正确地进行导入。 Python 之所以有效,是因为在 3.3+ 中支持命名空间包,但 mypy 需要一个标志来专门检查这些包。

因此,我的整体解决方案是添加所需的 __init__.py 文件。