兄弟包导入和 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
文件。
我正在尝试从 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
文件。