为什么 mypy 看不到 typeshed 中的类型?

Ben*_*Ben 5 python beautifulsoup mypy

我正在尝试向现有代码库添加更多 mypy 类型注释。我有一个使用大量 bs4 的文件。

当我对此文件运行 mypy 检查器时,出现错误:

error: Skipping analyzing "bs4": module is installed, but missing library stubs or py.typed marker
Run Code Online (Sandbox Code Playgroud)

关于“缺少库存根”的 mypy 文档中,它说:

Mypy 不会尝试推断您已安装的任何第三方库的类型,除非它们已声明自己是符合 PEP 561 的存根包(例如使用 py.typed 文件)或已在typeshed(类型的存储库)上注册。标准库和一些第三方库。

但是当我查看 typeshed时,一组存根。如何修复该错误并告诉它从 typeshed 查看存根定义?

BS4 和 mypy 都运行最新版本。

这个问题提出了一个关于黑色的类似问题,但是当我在代码中测试黑色时,mypy 并没有抱怨,但似乎他们已经以不同的方式解决了它,因为 typeshed 中没有黑色存根。

STe*_*kov 1

mypy这是typeshed的内容。它不包含第三方库,仅限于标准库。因此, for 的类型beautifulsoup并未附带mypy(这样做真的很奇怪,因为这些存根的更新有时比mypy其本身更频繁,而且其他类型检查器也依赖于这种类型)。所以你需要单独安装所需的存根(包主页):

pip install types-beautifulsoup4
Run Code Online (Sandbox Code Playgroud)

  • 是的,这是常见的约定。包“something”的存根包应该称为“types-something”。提到[这里](https://mypy.readthedocs.io/en/stable/installed_pa​​ckages.html#using-installed-packages),所以它是官方的`mypy`位置(其他类型检查器认为它很方便,所以依赖相同的命名)。请注意,您永远不应该“导入”它们,只需要“pip install”(或其他安装方法)。不要从此包中导入任何类型,否则类型检查将失败。从普通包导入,可选择使用“if TYPE_CHECKING”包装导入并使用“annotations” future (2认同)