Pyright 入门指南:微软出品的 Python 类型检查器

Pyright 是微软开发的快速 Python 静态类型检查器(Pylance 的内核)。本文讲解安装配置、类型检查原理、高级注解、类型收窄与 Final/Literal 的用法。

最佳实践
并发任务的多路径协同插画

直接回答:Pyright 是微软用 TypeScript 打造的 Python 静态类型检查器,也是 VS Code 里 Pylance 的分析内核:检查速度快、规则严格、类型收窄智能——可与 VS Code 工作流结合,仍需配置和逐步处理诊断。

Pyright 的生态位

Mypy 与 Pyright 都实现 Python 类型规范,推断细节和插件支持有区别;Pyright 提供面向编辑器的增量分析,耗时需按项目测量。你在 VS Code 里看到的红色波浪线,背后就是它。命令行版本可独立跑 CI。

安装与起步

npm install -g pyright    # 微软官方 CLI 分发方式
# pip install pyright 是第三方 Python 包装器,需核对来源与版本
# calc.py
def divide(a: float, b: float) -> float:
    return a / b

result = divide("10", 2)   # 类型错误
pyright calc.py
# error: Argument of type "str" cannot be assigned to parameter "a" of type "float"

配置文件

pyrightconfig.json:

{
  "include": ["src"],
  "exclude": ["**/node_modules", "tests/fixtures"],
  "pythonVersion": "3.13",
  "typeCheckingMode": "strict",
  "reportMissingImports": true
}

typeCheckingMode 有 off/basic/standard/strict 四档。存量项目从 basic 起步,新模块直接 strict。

理解 Pyright 的检查风格

Pyright 以"严格但讲理"著称:

  • 未注解函数默认参数为 公开资料未说明(strict 下视为告警源);
  • 可选值必须先判空再使用;
  • 类型推断极其积极——x = [] 会被推断为 list[公开资料未说明] 并要求你补注解。
def get_first(items: list[str]) -> str | None:
    return items[0] if items else None

name = get_first(["a"])
name.upper()          # ERROR:name 可能是 None
if name:
    name.upper()      # OK:收窄后为 str

类型收窄的高级玩法

from typing import TypeGuard

def is_int_list(val: list[object]) -> TypeGuard[list[int]]:
    return all(isinstance(x, int) for x in val)

def handle(data: list[object]):
    if is_int_list(data):
        sum(data)     # 此处 data 已是 list[int]

isinstance、assert、match 语句都能触发收窄——Pyright 对模式匹配的类型推断支持尤其出色。

Final 与 Literal:把约定变成硬约束

from typing import Final, Literal

TIMEOUT: Final = 30        # 任何再赋值都是错误

def log(level: Literal["debug", "info", "warn"], msg: str): ...
log("trace", "x")          # ERROR:非法字面量

配置常量用 Final,状态枚举用 Literal——比起跑起来的 ValueError,编辑器里的红波浪线便宜得多。

常见问题(FAQ)

Q:Pyright 和 Mypy 结果不一致听谁的?
A:两者对 PEP 的解读偶有分歧。团队定一家做 CI 标准(依据项目需求选定,不代表某个检查器是规范裁决者),编辑器里用 Pyright 求速度体验。注解写法保持两家兼容。

Q:strict 模式太严格落地不了?
A:按目录覆盖配置:核心模块 strict,其余 basic,逐步推进。# pyright: strict 文件级指令也行。

Q:和 Pyrefly 比呢?
A:Pyrefly 使用 Rust,实际速度和规则兼容性需在项目上评估;Pyright 成熟稳定、VS Code 原生。都是好东西,选与团队工具链咬合更紧的。

官方参考

本文基于官方文档整理,未进行运行时或性能测试。示例中的业务函数、数据模型和部署地址需结合项目补全;局部片段不等同于完整生产应用。

延伸阅读

获取专属方案

联系我们

加入社区

微信扫码
加入官方交流群

立即体验

在线开通,按量计费,真正的云服务!

立即开始

选择观测云版本

代码托管平台