MyPy 找不到我本地包的类型。

7

我有两个Python包。一个是工具库,另一个是将使用该工具库的应用程序(最终我将有更多的应用程序共享该库)。

我正在使用Poetry管理这两个包,并且应用程序使用pathdevelop属性指定公共库作为依赖项。

例如,我的布局看起来像这样:

- common/
   - common/
      - __init__.py
      - py.typed
   - pyproject.toml

- myapp/
   - myapp/
      - __init__.py
      - py.typed
   - pyproject.toml

myapp\pyproject.toml 看起来大致如下:

[tool.poetry]
name = "myapp"
version = "0.1.0"
description = ""
authors = ["Your Name <you@example.com>"]

[tool.poetry.dependencies]
python = "^3.9"
common = { path = "../common", develop = true }

[tool.poetry.dev-dependencies]
mypy = "^0.910"
flake8 = "^4.0.1"
black = {version = "^21.12b0", allow-prereleases = true}
pytest = "^6.2.5"
pytest-cov = "^3.0.0"
pytest-mock = "^3.6.1"

[build-system]
requires = ["poetry-core>=1.0.0"]
build-backend = "poetry.core.masonry.api"

当我在myapp上运行mypy时,我会得到类似以下的结果:
myapp/__init__.py:1:1: error: Cannot find implementation or library stub for module named "common"  [import]
3个回答

2

2
我的util/common包中有一个py.typed文件(请参见上面的目录结构)。它是否放错位置了?我尝试将其移动到上一级目录,但仍然无法解决问题。 - niltz
1
抱歉,我之前漏掉了那个。我怀疑 py.typed 可以用于已经安装的软件包,因此您可能需要尝试以 --editable 模式安装软件包:cd <path-to-package>/common pip install -e ./ - Giorgio Balestrieri
你曾经解决过这个问题吗?我也遇到了同样的问题,在网上找不到任何相关信息。 - Simone Bolognini

0

-1
以下方法适用于我:将您的库路径添加到MYPYPATH环境变量中:
export MYPYPATH=$MYPYPATH:path/to/common

如果需要的话,您可以在bash配置文件中进行设置。我不知道是否有更清晰的方法使mypy自动检测这些本地包。文档中说

找不到实现或库存根

如果您遇到了无法找到模块的实现或库存根错误,这意味着mypy无法找到您要导入的模块,无论它是否与类型提示捆绑在一起。如果您遇到此错误,请尝试:

  1. 阅读下面的如何查找导入项部分,以确保您了解mypy如何搜索和查找模块,并相应地修改您调用mypy的方式。

  2. 直接从命令行指定包含要检查类型的模块的目录,使用mypy_pathfiles配置文件选项,或使用MYPYPATH环境变量。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接