【问题标题】:Sibling package import and mypy "has no attribute" error兄弟包导入和mypy“没有属性”错误
【发布时间】:2021-03-02 11:26:00
【问题描述】:

我正在尝试从 Python 中的同级包中导入模块;按照this answer 中的说明进行操作。我的问题是导入工作......但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

在 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 时,以下导入/运行正常:

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

我的问题

为什么当导入确实有效时 mypy 会在此处显示错误?如何让 mypy 识别导入有效?

【问题讨论】:

    标签: python package python-import mypy


    【解决方案1】:

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

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

    【讨论】:

    • --namespace-packages 应该是默认值。毕竟你希望以 Python 3.3+ 为目标...
    猜你喜欢
    • 2021-10-05
    • 2019-09-19
    • 1970-01-01
    • 2020-06-26
    相关资源
    最近更新 更多