Pyright 在 VSCode 默认不启用严格类型检查,需通过项目根目录的 pyrightconfig.json(设 "typeCheckingMode": "strict")或 pyproject.toml(在 [tool.pyright] 下设 typeCheckingMode = "strict")配置;且须将 VSCode 的 python.languageServer 显式设为 Pyright 而非默认的 Pylance,否则配置无效。

Pyright 在 VSCode 里默认没开严格检查
VSCode 安装了 pyright 插件,不代表它就在做严格类型检查。它默认只启用基础类型推导和简单错误提示(比如调用不存在的方法),Any 泛滥、缺失类型注解、协变/逆变误用这类问题全被放过。
真正触发严格模式,得靠配置文件——不是插件设置页,也不是 settings.json 里的开关,而是项目根目录下的 pyrightconfig.json 或 pyproject.toml。
-
pyrightconfig.json更直接:加"typeCheckingMode": "strict"就生效 - 用
pyproject.toml的话,必须写在[tool.pyright]下,且字段名是typeCheckingMode = "strict",写成type_checking_mode或漏掉tool.前缀都不认 - 如果项目里同时存在两个配置文件,
pyrightconfig.json优先级更高,容易误以为 toml 生效了其实没读
vscode-python 和 pyright 插件谁管类型检查
VSCode 自带的 python 官方插件(ms-python.python)默认用的是 Pylance,不是 pyright。虽然 Pylance 底层基于 Pyright,但它把严格模式关得很死——即使你配了 pyrightconfig.json,Pylance 仍可能忽略 reportMissingTypeStubs 这类检查项。
要让严格检查真正起作用,必须手动切换语言服务器:
立即学习“Python免费学习笔记(深入)”;
- 打开 VSCode 设置(
Ctrl+,),搜python.defaultInterpreterPath确保解释器正确 - 再搜
python.languageServer,把它从Pylance改成Pyright - 改完重启窗口,看右下角状态栏是否显示
Pyright而非Pylance;不显示就说明没切成功
strict 模式下最常爆红的三类代码
开了 "typeCheckingMode": "strict" 后,不是所有红波浪线都代表真错误,有些是类型系统“太较真”。但以下三类基本就是该修的硬伤:
- 函数参数没注解,返回值也没写
-> None:Pyright 会报reportGeneralTypeIssues,哪怕函数体只有一行pass -
dict/list字面量没泛型,比如写data = {"x": 1},Pyright 推成Dict[str, Any],后续取值时data["x"] + 1就报错——得显式写成data: Dict[str, int] = {"x": 1} - 用
Union[A, B]但实际只传了A,而函数内部又对B做了属性访问:Pyright 会按最宽路径检查,哪怕你“知道”不会走到那边,它也报reportOptionalMemberAccess
pyrightconfig.json 配置项别乱开,先盯住这几个
Strict 模式自带一堆子规则(reportXXX),全打开容易被警告淹没。建议起步只调这三项,其他保持默认:
-
"reportMissingTypeStubs": "error":第三方库没提供类型存根(.pyi)就报错,提醒你装types-requests这类包 -
"reportUnknownArgumentType": "warning":调用函数时传入了没类型注解的变量,给 warning 而非 error,避免阻断开发流 -
"reportUnknownVariableType": "off":局部变量类型推导失败时不报,否则连for i in range(10)的i都标黄
这些开关在 pyrightconfig.json 里必须平级写在根对象下,不能套进 include 或 exclude 里,否则静默失效。
类型检查不是越严越好,而是越贴合团队当前能力越好。一个刚加类型注解的项目,先把 reportMissingTypeStubs 设为 error,其余先 warning,跑两周再升级。否则第一晚就被 200+ 条 reportOptionalSubscript 堵死提交流程。


















