兄弟包导入和 mypy“没有属性”错误

apn*_*ton 3 python package python-import mypy

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

目录结构/代码

这是我已成功安装的模块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
Run Code Online (Sandbox Code Playgroud)

在 db.py 中:

from mypackage.bar import model
Run Code Online (Sandbox Code Playgroud)

在model.py中:

class MyClass:
  # implementation irrelevant
Run Code Online (Sandbox Code Playgroud)

错误信息

当我运行 mypy(mypy mypackage从项目基目录)时,出现以下错误:

mypackage/foo/db.py:7: error: Module 'mypackage.bar' has no attribute 'model'
Run Code Online (Sandbox Code Playgroud)

让我感到困惑的是,当我打开 IDLE 时,以下导入/运行得很好:

>>> from mypackage.bar import model
>>> model.MyClass
<class 'mypackage.bar.model.MyClass'>
Run Code Online (Sandbox Code Playgroud)

我的问题

为什么当导入实际工作时 mypy 在这里显示错误?如何让 mypy 识别导入有效?

apn*_*ton 5

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

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

  • `--namespace-packages` 也许应该是默认值。毕竟您 **希望** 的目标是 Python 3.3+... (2认同)