🐍Python 语言基础

类型注解与 typing

面试回答

常见问法

  • Python 的类型注解在运行时有什么用?
  • Listlistlist[int] 有什么区别?
  • OptionalUnion|Any 分别在什么场景用?
  • GenericTypeVarProtocol 怎么用?

回答

待补充:核心是「运行时不强制,但工程可读性、IDE 补全、静态检查(mypy/pyright)全依赖它」,同时要讲清楚 3.9+ 后内建泛型的演进。

追问

  • TypedDictdataclass 怎么选?
  • ProtocolABC 的区别?
  • 泛型函数怎么写?def f(x: T) -> T 是什么意思?
  • LiteralFinalAnnotated 分别解决什么问题?

原理展开

  • 基础:x: int = 1,def f(a: str) -> bool:
  • 演进:
    • 3.5 引入 typing 模块
    • 3.9 list[int] / dict[str, int] 可直接写
    • 3.10 int | None 替代 Optional[int]
    • 3.12 type 语句 + 新泛型语法 def f[T](x: T) -> T
  • 常用类型:Optional / Union / Any / Callable / Iterable / Awaitable / Literal / Final
  • 结构化类型:Protocol(duck typing 静态化)
  • 泛型:TypeVar('T')Generic[T]
  • 运行时工具:typing.get_type_hints@runtime_checkable

易错点

  • 把类型注解当成强约束,以为会运行时报错
  • list 内的元素类型是 Any,没写 list[int]
  • 循环引用时忘了用 from __future__ import annotations 或字符串前向引用
  • Optional[X]X = None 不写默认值,导致调用方必填

记忆技巧

  • 三层含义:运行时 = 装饰品,静态检查 = 真保护,IDE = 真生产力
  • 现代写法:3.10+ 用 X | Y,3.9+ 用 list[int]
  • 结构 vs 名义:Protocol 看形,ABC 看名