python - 为什么 mypy 认为缺少库导入?

标签 python mypy

当我运行 mypy 时,它提示找不到模块:

sal@ahfang:~/workspace/ecs/cx-project-skeleton-repo/src/cx-example-function$ pipenv run python -m mypy .
example_lambda.py:3: error: Cannot find module named 'aws_xray_sdk.core'
但是,当尝试使用完全相同的 Python 解释器导入完全相同的模块时,似乎该模块确实存在并且是可导入的。
python 
Python 3.7.3 (default, Apr  3 2019, 05:39:12) 
[GCC 8.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> import aws_xray_sdk.core
>>>
除了强制忽略 mypy.ini 文件中的导入之外,我应该做些什么来帮助 mypy 查看确实存在的可导入模块吗?

最佳答案

所以,这就是问题的症结所在:mypy 不会尝试对您导入的每个模块进行类型检查。相反,它只尝试对已明确选择加入类型生态系统的模块进行类型检查。

模块可以通过两种关键机制选择加入打字生态系统:

  • 将类型提示或 stub 添加到他们的代码中,并包含一个名为 py.typed 的文件在他们分发到 PyPi(或任何其他包存储库)的包中。这个标记的存在使得包PEP-561-aware . mypy 文档也有关于 PEP-561-aware packages 的更多信息。 .
  • 或者,将 stub 添加到 typeshed ,标准库的类型提示存储库并选择第 3 方库。
  • aws_xray_sdk package 没有做这些事情,所以会被 mypy 忽略。

    这有点不幸,所以你能做什么? Missing imports mypy 文档的部分有一些关于做什么的详细建议,但总而言之,你基本上有三个选项,我将按照从最少到最多的顺序列出:
  • 只需手动添加 # type: ignore 即可使导入静音对每个导入的评论。您还可以将以下部分添加到您的 mypy 配置文件中以自动执行此操作:
    [mypy-aws_xray_sdk]
    ignore_missing_imports = True
    

    现在,您从此模块导入的任何内容都将被视为 Any 类型。 .
  • 四处搜索,看看是否有人为您的库创建了第三方 stub 包:基本上,一个仅包含类型提示的非官方(或有时是半官方的)PEP-561 感知包。例如,对于 django,有 django-stubs ,对于 SqlAlchemy,有 sqlalchemy-stubs .
  • 为这个库创建你自己的 stub 并通过 mypy_path 指向它们mypy 配置文件中的选项:
    mypy_path = my_stubs/aws_xray_sdk, my_stubs/some_other_library
    

    这些 stub 不一定是完整的:您只需为您正在使用的少数东西添加注释即可。 (如果它们最终变得相对完整,您可能会考虑将它们贡献回开源社区。)


  • 最后,您可能想知道为什么 mypy 会这样?

    部分原因是在一般情况下,mypy 尝试查找和分析模块是不安全的。只是盲目地导入和使用未准备好类型提示的包有时会导致奇怪的类型错误,或者更糟的是,可能导致代码被错误地标记为类型安全。也就是说,如果您关心类型安全,最好立即通知您正在使用的某些包没有类型提示,而不是 mypy 盲目推断和涂抹 Any s 遍布你的代码。

    不过,至少在大多数情况下,Mypy 可以在这里给出更好的错误信息。 IMO 事实上,它没有在很大程度上是一个疏忽。 https://github.com/python/mypy/issues/4542 中对此有一些讨论。 .

    关于python - 为什么 mypy 认为缺少库导入?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57785471/

    相关文章:

    python - 如何获取稀疏矩阵数据数组的对角线元素的索引

    python - 从多个 csv 文件创建二维矩阵

    python - 如何使用 Kivy 制作工具提示?

    python - 当我尝试将值迭代算法与 mdptoolbox 一起使用时出现 OverflowError

    python - mypy 可以检查文档字符串吗?

    python - 启用 mypy `strict_Optional 有什么优点?

    Python 类型检查协议(protocol)和描述符

    python - 为什么 list(map(func, set)) 在 Python 中总是给出排序列表?

    mypyc, key 错误 : '__file__'

    子类实例的 Python 类型签名?