🐍Python 语言基础
类型注解与 typing
面试回答
常见问法
- Python 的类型注解在运行时有什么用?
List、list、list[int]有什么区别?Optional、Union、|、Any分别在什么场景用?Generic、TypeVar、Protocol怎么用?
回答
待补充:核心是「运行时不强制,但工程可读性、IDE 补全、静态检查(mypy/pyright)全依赖它」,同时要讲清楚 3.9+ 后内建泛型的演进。
追问
TypedDict和dataclass怎么选?Protocol和ABC的区别?- 泛型函数怎么写?
def f(x: T) -> T是什么意思? Literal、Final、Annotated分别解决什么问题?
原理展开
- 基础:
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
- 3.5 引入
- 常用类型:
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看名