直接回答:类型注解的价值在编译期(编辑期)捕获类别错误和充当机器可读的接口文档:IDE 跳转补全质变、重构有信心、CI 里 mypy/pyright 拦住"None 传进来炸了"这类事故。边界同样清楚:注解不影响运行时(def f(x: int) 传字符串照跑),它是渐进式的——允许部分代码无类型,覆盖率和严格度是团队策略而非语言强制。

展开解析:用出实效的实践:从 disallow_untyped_defs = false 起步,核心库与新代码逐步加严;公共 API 和数据结构(dataclass/Pydantic 模型)优先标注,内部实现允许 Any 过渡;CI 固定 mypy 版本和配置,避免升级引入的新报错打断主干。类型系统的能力点要会用:Protocol 做结构化子类型(鸭子类型的静态化)、TypeVar 泛型容器、Literal 收窄字符串枚举、TypeGuard 让运行期判断反哺静态收窄。常见误区:过度追求 strict 满分导致满纸 cast 和 ignore(类型体操吞噬表达力);在运行时依赖注解做校验——那是 Pydantic 的活,它读注解生成校验器,类型提示与运行时校验在此合流。判断标准:注解让读代码的人更快理解契约,而不是更累。

追问方向:Protocol 与 ABC 的取舍?协变逆变在容器标注中的体现?为什么 mypy 与 pyright 结论偶尔不同?

(约 450 字)