错误:跳过分析“flask_mysqldb”:找到模块但没有类型提示或库存根

Posted

技术标签:

【中文标题】错误:跳过分析“flask_mysqldb”:找到模块但没有类型提示或库存根【英文标题】:error: Skipping analyzing 'flask_mysqldb': found module but no type hints or library stubs 【发布时间】:2020-06-28 04:27:46 【问题描述】:

我正在使用 Python 3.6 和 flask。我使用flask-mysqldb 连接到MySQL,但每当我尝试在我的程序上运行mypy 时,我都会收到此错误:

跳过分析“flask_mysqldb”:找到模块但没有类型提示或 库存根。

我尝试使用标志ignore-missing-importsfollow-imports=skip 运行mypy。然后我没有收到错误。为什么我会收到此错误? 如何在不添加任何其他标志的情况下解决此问题?

【问题讨论】:

您可以将附加标志放在mypy.ini 文件中,这样您就不必手动输入它们,或者为flask_mysqldb 包编写一个类型存根文件并将mypy 指向该文件存根文件(通过MYPY_PATH 环境变量,或通过mypy.ini 配置中的mypy_path 设置)。 【参考方案1】:

您收到此错误是因为 mypy 并非旨在尝试对您尝试导入的每个模块进行类型检查。这主要有三个原因:

    您尝试导入的模块可能以无法进行类型检查的方式编写。例如,如果模块在全局范围内执行my_list = [] 之类的操作,mypy 将请求类型提示,因为它不知道该列表应该包含什么。

    这些类型的错误超出了使用图书馆的人的控制范围,因此可能会随处发送垃圾邮件,这将是令人讨厌和破坏性的。

    即使您尝试导入类型的库模块检查干净,如果它不使用类型提示,您也不会从尝试将它与 mypy.如果库是动态类型的,mypy 可以静默接受实际上在运行时不进行类型检查的代码。

    这可能会让人们感到惊讶/默默地做错事通常是个坏主意。相反,您会收到明确的警告。

    并非所有模块都是用 Python 编写的——有些模块实际上是 C 扩展。 Mypy 无法分析这些模块,因此必须实现一些忽略模块的机制。

如果您没有收到此错误,这意味着以下五种情况之一:

    Typeshed 中已经存在您库的类型提示,它与 mypy 预先捆绑在一起。 Typeshed 主要包含标准库和少数流行的 3rd 方库的类型提示。

    该库已经在使用类型提示,并声明它希望由 mypy 进行分析和类型检查。这是通过在包中包含一个特殊的py.typed 文件来完成的,该文件使其成为PEP 561 compatible。

    您已安装第 3 方“仅限存根”软件包。这个包可以与库一起安装,让人们无需修改库本身就可以提供类型提示。例如,django-stubs 包包含与 PEP 561 不兼容的 Django 库的类型提示。

    您已将 mypy 配置为使用您自己的自定义存根。也就是说,您基本上已经创建了自己的本地“仅存根”包并告诉 mypy 使用它。

    您已决定抑制错误并接受库现在是动态类型的事实 - 例如,通过使用您找到的命令行标志或在导入中添加 # type: ignore .

有关如何处理此错误的更多详细信息,请参阅mypy docs on dealing with missing type hints from 3rd party libraries。

【讨论】:

感谢您的好评!我在调试内部库中缺少的一些类型提示时发现了这个问题。我以前从未听说过py.typed,事实证明这正是我所需要的。像我这样的其他Poetry用户的相关讨论:github.com/python-poetry/poetry/issues/…【参考方案2】:

以防万一对任何人都有用。我也收到了found module but no type hints or library stubs 错误,原因是我添加了一个带有 python 文件但没有__init__.py 文件的新文件夹。所以修复当然是将那个空文件添加到这个新文件夹中。 https://mypy.readthedocs.io/en/latest/running_mypy.html#how-imports-are-found

【讨论】:

以上是关于错误:跳过分析“flask_mysqldb”:找到模块但没有类型提示或库存根的主要内容,如果未能解决你的问题,请参考以下文章

使用 flask_mysqldb 获取“未加载库:libssl.1.0.0.dylib”、“原因:找不到图像”

找到最大强度给定要在左右跳过的元素数量。请告诉我为啥我的代码对某些测试用例给出了错误的输出?

Amazon RDS 只读副本——跳过复制错误

思科模拟器怎么跳过登录

打开VsCode经常弹出:尝试在目标目录创建文件时发生一个错误:拒绝访问:重试 跳过这个文件(不推荐),关闭安装程序

Java使用Excel的问题:自动跳过空字段中文加拼音和时间处理错误的解决方法