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 识别导入有效?
运行带有--namespace-packages标志的mypy使检查运行没有错误,这将我指出了实际问题:./mypackage/mypackage/__init__.py不存在,导致mypy无法正确执行导入。Python 可以工作,因为在 3.3+ 中,支持命名空间包,但 mypy 需要一个标志来专门检查那些包。
因此,我的整体解决方案是添加所需的__init__.py文件。