Mypy未检测到外部导入函数错误调用的问题排查
问题原因与解决方案
你遇到的问题核心是已安装的Python包没有向mypy提供类型信息,导致mypy将导入的foo函数视为"无类型"对象,从而跳过了类型检查。
具体原因
- 本地定义的
internal_foo:mypy直接读取源码解析类型签名,能正常检测调用错误。 - 安装后的
my_package.example.foo:mypy默认不会解析已安装包的源码,除非包明确声明包含类型信息,因此它会把该函数当成无类型对象,不触发类型校验。
解决步骤
1. 添加类型标记文件
在my_package目录下创建一个空的py.typed文件——这是Python官方标准标记,用于告知mypy该包包含类型注解,需要进行类型检查。
2. 修改setup.py确保打包包含标记文件
更新setup.py,添加package_data配置,保证py.typed被纳入wheel包:
from setuptools import setup setup( name='ExamplePackage', version='0.1.0', author='An Awesome Coder', author_email='aac@example.com', packages=['my_package'], package_data={'my_package': ['py.typed']}, include_package_data=True, description='An awesome package that does something', )
3. 重新打包安装
执行打包命令生成新的wheel文件:
python ./setup.py bdist_wheel
将新wheel文件复制到目标项目后重新安装:
pip install ExamplePackage-0.1.0-py3-none-any.whl
4. 验证mypy检查结果
再次运行mypy main.py,会看到与internal_foo一致的错误提示:
error: Missing positional arguments "number", "text" in call to "foo" [call-arg] error: "foo" does not return a value [func-returns-value]
内容的提问来源于stack exchange,提问作者yanivps
相关产品推荐
相关产品推荐

