pyright严格模式需三步生效:先将vscode的python.languageserver设为pyright而非pylance,再在项目根目录配置pyrightconfig.json(含"typecheckingmode": "strict")或pyproject.toml([tool.pyright]下typecheckingmode = "strict"),最后重启窗口确认状态栏显示pyright。

Pyright 不是靠“安装插件”就自动生效的类型检查器——它必须被显式设为语言服务器,且需配合项目级配置文件才能触发严格检查。默认状态下,VSCode 的 Python 扩展(ms-python.python)用的是 Pylance,哪怕你装了 Pyright 插件,它也只当个旁观者。
确认 VSCode 正在用 Pyright 而不是 Pylance
这是最关键的一步,90% 的人卡在这儿:Pylance 和 Pyright 是两个独立的语言服务器,Pylance 底层虽基于 Pyright,但默认关闭了绝大多数严格检查项(比如 reportMissingTypeStubs、reportUnknownArgumentType)。你改 settings.json 里的 python.analysis.typeCheckingMode 对它基本没用。
必须手动切换:
- 打开 VSCode 设置(
Ctrl+,),搜python.languageServer - 把值从
Pylance改成Pyright - 重启窗口,看右下角状态栏是否显示
Pyright—— 不显示就说明没切成功 - 如果提示 “Pyright not found”,说明没装官方插件:去扩展市场搜
Pyright(作者是 Microsoft),安装并重载
用 pyrightconfig.json 或 pyproject.toml 启用 strict 模式
Pyright 的严格模式不会从 VSCode 设置里读,它只认项目根目录下的配置文件。靠 settings.json 或插件 UI 开关是无效的。
推荐用 pyrightconfig.json,简单直接:
{
"typeCheckingMode": "strict",
"reportMissingTypeStubs": "error",
"reportUnknownArgumentType": "error"
}
如果用 pyproject.toml,必须写成这样:
[tool.pyright] typeCheckingMode = "strict" reportMissingTypeStubs = "error"
注意两点:
- 字段名是
typeCheckingMode(驼峰),不是type_checking_mode或typecheckingmode - 必须放在
[tool.pyright]下,漏掉tool.前缀,Pyright 就当没这回事
如果两个配置文件同时存在,pyrightconfig.json 优先级更高 —— 容易误以为 toml 生效了,其实根本没读。
为什么 strict 模式下会报一堆 “Any” 相关错误?
启用 "typeCheckingMode": "strict" 后,你会立刻看到大量 Expression of type "Any" is not assignable to... 这类报错。这不是 bug,是 Pyright 在告诉你:这些地方缺少类型注解,或者依赖了没提供类型存根(stub)的第三方包。
常见诱因:
- 调用了没类型注解的函数(比如自己写的旧函数没加
def foo(x: str) -> int:) - 用了没发布
.pyi文件的库(如某些小众包或内部 SDK),Pyright 默认把它当Any -
import语句没标注(如import requests,但requests没带 stub,返回值全推成Any)
解决方向不是关掉检查,而是:
- 给关键函数补
->返回类型和参数注解 - 对无 stub 的依赖,加
typings目录手写简易.pyi,或在配置里用include/exclude控制范围 - 用
# pyright: ignore行注释临时跳过个别棘手位置(慎用)
Pyright 和 mypy 该选哪个?
别混着用。Pyright 是编辑器内实时检查主力,mypy 是 CI/CD 或手动跑的深度验证工具。
差异很实在:
-
Pyright增量快,支持未标注代码的上下文推断(比如x = "hello"; len(x)能推x是str),适合日常开发反馈 -
mypy更保守,要求显式注解才敢下结论,启动慢但规则更细(比如对泛型协变/逆变检查更严),适合交付前兜底 - 两者配置不互通:
mypy.ini对 Pyright 无效,pyrightconfig.json也不影响 mypy
如果你只配一个,先搞定 Pyright + strict;需要团队强约束再加 mypy 到 pre-commit 或 CI。
真正起作用的从来不是插件图标亮了,而是右下角显示 Pyright 且报错开始变多——那才是类型检查活过来了。配置文件路径、字段名、语言服务器切换,三者缺一不可,少一个,strict 就只是个摆设。











