为什么 mypy 发现我的任何导入“没有类型提示或库存根”?

Ale*_*air 25 python type-hinting mypy

我正在开发一个代码库,其中有很多由以前的开发人员编写的类型提示。在某些时候,我注意到这些提示没有进行类型检查,如果我想检查它们,我需要在构建中添加一个步骤。我对 python 很熟悉,但从未使用过类型提示,所以我读了很多关于它们的文章,但我仍然有很多东西需要理解。最终我得出结论,mypy 是用于对这些类型提示进行类型检查的主程序。所以我 pip 安装了 mypy 并运行mypy .。我遇到了很多这样的错误;

error: Skipping analyzing 'setuptools': found module but no type hints or library stubs
error: Skipping analyzing 'numpy': found module but no type hints or library stubs
error: Skipping analyzing 'tensorflow.compat.v1': found module but no type hints or library stubs
error: Skipping analyzing 'tensorflow': found module but no type hints or library stubs
Run Code Online (Sandbox Code Playgroud)

我很惊讶这些默认情况下被视为错误,因为我读到的有关类型提示的所有内容都强调它们是可选的。所以我的第一个问题是,为什么 mypy 将上述内容视为显示停止错误而不是简单的警告?

然后我用谷歌搜索错误消息并找到mypy 文档的此页面。这可以说是非常清楚的,但令我困惑的是,它似乎表明这个错误是一个应该解决的大问题。它提供了多个选项来解决它,增加工作量,然后它们最终告诉您 CLI 标志将消除所有错误。当然,大多数项目都会导入不使用类型提示的库,并且需要使用此标志?

由于这些线索,我决定我应该继续尝试,寻找包裹。接下来让我困惑的是,它似乎无法找到我所有导入的类型提示。我不希望更多晦涩的库有书面类型提示,但肯定有人为 numpy 或 pytest 编写了它们?types-文档说我应该通过附加到主包名称来查找包,因此我运行了pip install types-numpy,但它没有找到任何内容。

现在我开始怀疑我的机器是否无法连接到某种服务,比如“typeshed”是什么?Pip 可以很好地找到包,但也许 typeshed 是一个当前已关闭的单独协议或其他什么?或者这与我使用旧版本的 python (3.6) 有关吗?我决定在这里手动搜索软件包,但我几乎没有看到任何以types-.

所以我的总体问题是,是否发生了奇怪的事情,或者我应该使用该--ignore-missing-imports标志运行 mypy 并继续?

Anj*_*i A 11

此错误是因为mypy无法找到您尝试导入的模块,无论它是否与类型提示捆绑在一起。另外,请确保您的导入没有拼写错误。

您可以通过运行建议的 pip 命令来解决该问题。或者,您可以使用--install-types安装所有已知缺失的存根:mypy --install-types

  • 我在“requests”库中遇到了同样的错误。运行“mypy --install-types”返回 0 代码,但不执行任何操作。我什至手动安装了“types-requests”,但遇到了同样的问题。 (10认同)
  • 我刚刚尝试运行 `mypy --install-types`;该命令退出并返回代码 0,但没有输出。运行 mypy 仍然给出“已找到模块,但没有类型提示或库存根”。 (7认同)
  • 错误消息显示“已找到模块,但没有类型提示或库存根”,所以我希望它已找到模块。我还知道模块已安装,因为使用该模块的代码按预期运行。 (4认同)
  • 请参阅/sf/ask/4250153771/。其中给出了详细的解释。希望能帮助到你! (3认同)