You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何mypy忽略存根文件?运行mypy未报错的原因

问题描述

目录结构

.
├── mymod.py
└── mymod.pyi

相关文件内容

mymod.py

def add(a, b):
    return a + b

if __name__ == "__main__":
    add(None, None)

mymod.pyi

from typing import (
    Union,
)

def add(a: Union[int, str], b: Union[int, str]) -> Union[int, str]: ...

未设置任何存根文件相关环境变量或配置,且已清除mypy缓存,运行mypy mymod.py时为何未生成任何错误?


原因解析
  • mypy默认忽略__main__代码块的类型检查:你调用add(None, None)的逻辑处于if __name__ == "__main__":代码块中,mypy的默认规则不会对这个代码块做类型校验,所以即便传入了不符合存根定义的参数,也不会触发错误提示。
  • 存根文件主要约束外部导入场景:存根文件的作用是给其他导入该模块的代码提供类型校验依据。如果有其他Python文件导入mymod并调用add(None, None),mypy就会根据存根里的类型定义抛出错误,但直接检查模块本身时,内部的__main__代码块不在校验范围内。

如果想要让mypy检查__main__代码块的类型问题,可以添加--check-untyped-defs参数执行检查,比如运行mypy --check-untyped-defs mymod.py,此时就能看到add(None, None)违反类型定义的错误提示了。


内容的提问来源于stack exchange,提问作者tinkerbeast

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.12 11:59:53