error: Skipping analyzing 'flask_mysqldb': found module but no type hints or library stubs
error: Skipping analyzing 'flask_mysqldb': found module but no type hints or library stubs
我正在使用 Python 3.6 和 flask
。我使用 flask-mysqldb
连接到 MySQL
,但每当我在我的程序上尝试 运行 mypy
时,我都会收到此错误:
Skipping analyzing 'flask_mysqldb': found module but no type hints or
library stubs.
我尝试 运行 宁 mypy
与标志 ignore-missing-imports
或 follow-imports=skip
。然后我没有收到错误。为什么会出现此错误?
如何在不添加任何额外标志的情况下解决此问题?
您收到此错误是因为 mypy 并非旨在尝试对您尝试导入的每个模块进行类型检查。这主要是出于三个原因:
您尝试导入的模块的编写方式可能无法通过类型检查。例如,如果模块在全局范围内执行类似 my_list = []
的操作,mypy 将请求类型提示,因为它不知道该列表应该包含什么。
这些类型的错误超出了使用这些库的人的控制范围,因此将它们无处不在地发送垃圾邮件会很烦人且具有破坏性。
即使您尝试导入的库模块类型检查干净,如果它没有使用类型提示,您也不会从尝试将它与 mypy 一起使用中获得太多好处。如果库是动态类型的,mypy 可以静默接受实际上在运行时不进行类型检查的代码。
这可能会让 people/silently 感到惊讶,做错事通常是个坏主意。相反,您会收到明确的警告。
并非所有模块都是用 Python 编写的——一些模块实际上是 C 扩展。 Mypy 无法分析这些模块,因此必须实现一些忽略模块的机制。
如果您没有得到这个错误,这意味着五件事之一:
您的库的类型提示已存在于 Typeshed 中,它与 mypy 预先捆绑在一起。 Typeshed 主要包含标准库和一些流行的第 3 方库的类型提示。
该库已经在使用类型提示,并声明它希望由 mypy 进行分析和类型检查。这是通过在包中包含一个特殊的 py.typed
文件来完成的,该文件使其成为 PEP 561 compatible.
您已经安装了第 3 方 "stubs-only" 软件包。这个包可以和库一起安装,让人们无需修改库本身就可以提供类型提示。例如,django-stubs 包包含 Django 库的类型提示,它不兼容 PEP 561。
您已将 mypy 配置为使用您自己的自定义存根。也就是说,您基本上已经创建了自己的本地 "stubs-only" 包并告诉 mypy 使用它。
您决定抑制错误并接受库现在是动态类型的事实 -- 例如,通过使用您找到的命令行标志或添加 # type: ignore
导入.
有关如何处理此错误的更多详细信息,请参阅 mypy docs on dealing with missing type hints from 3rd party libraries。
以防万一对任何人都有用。我也遇到了 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
我正在使用 Python 3.6 和 flask
。我使用 flask-mysqldb
连接到 MySQL
,但每当我在我的程序上尝试 运行 mypy
时,我都会收到此错误:
Skipping analyzing 'flask_mysqldb': found module but no type hints or library stubs.
我尝试 运行 宁 mypy
与标志 ignore-missing-imports
或 follow-imports=skip
。然后我没有收到错误。为什么会出现此错误?
如何在不添加任何额外标志的情况下解决此问题?
您收到此错误是因为 mypy 并非旨在尝试对您尝试导入的每个模块进行类型检查。这主要是出于三个原因:
您尝试导入的模块的编写方式可能无法通过类型检查。例如,如果模块在全局范围内执行类似
my_list = []
的操作,mypy 将请求类型提示,因为它不知道该列表应该包含什么。这些类型的错误超出了使用这些库的人的控制范围,因此将它们无处不在地发送垃圾邮件会很烦人且具有破坏性。
即使您尝试导入的库模块类型检查干净,如果它没有使用类型提示,您也不会从尝试将它与 mypy 一起使用中获得太多好处。如果库是动态类型的,mypy 可以静默接受实际上在运行时不进行类型检查的代码。
这可能会让 people/silently 感到惊讶,做错事通常是个坏主意。相反,您会收到明确的警告。
并非所有模块都是用 Python 编写的——一些模块实际上是 C 扩展。 Mypy 无法分析这些模块,因此必须实现一些忽略模块的机制。
如果您没有得到这个错误,这意味着五件事之一:
您的库的类型提示已存在于 Typeshed 中,它与 mypy 预先捆绑在一起。 Typeshed 主要包含标准库和一些流行的第 3 方库的类型提示。
该库已经在使用类型提示,并声明它希望由 mypy 进行分析和类型检查。这是通过在包中包含一个特殊的
py.typed
文件来完成的,该文件使其成为 PEP 561 compatible.您已经安装了第 3 方 "stubs-only" 软件包。这个包可以和库一起安装,让人们无需修改库本身就可以提供类型提示。例如,django-stubs 包包含 Django 库的类型提示,它不兼容 PEP 561。
您已将 mypy 配置为使用您自己的自定义存根。也就是说,您基本上已经创建了自己的本地 "stubs-only" 包并告诉 mypy 使用它。
您决定抑制错误并接受库现在是动态类型的事实 -- 例如,通过使用您找到的命令行标志或添加
# type: ignore
导入.
有关如何处理此错误的更多详细信息,请参阅 mypy docs on dealing with missing type hints from 3rd party libraries。
以防万一对任何人都有用。我也遇到了 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