

























Python 类型提示(type hints)大致可以分成几个阶段,每个阶段背后都有不同目标:文档化 → 静态分析 → 泛型系统 → 类型表达力增强 → 类型系统趋近现代语言。
早期 Python 是纯动态类型语言:
def add(a, b):
return a + b
类型完全依赖:
user_id, str_name)def greet(name):
"""
:type name: str
:rtype: str
"""
这其实算最早的“类型提示”。
特点:
真正转折点:
PEP 3107
引入:
def greet(name: str) -> str:
return "Hello " + name
但关键点:
这不是类型系统。
只是“给参数挂元数据”。
def foo(x: "anything"):
...
Python 本身不检查类型。
设计哲学:
注解语法先落地,用途以后再定义。
这是后来整个 typing 生态的地基。
真正现代类型系统开始:
PEP 484
引入:
from typing import List
def greet(names: List[str]) -> None:
...
同时诞生:
typing 模块TypeVarGenericUnionOptionalT = TypeVar("T")
def first(items: list[T]) -> T:
return items[0]
第一次:
这是革命性阶段。
这个阶段像寒武纪爆发。
age: int = 18
以前:
age = 18 # type: int
终于不用 type comment。
PEP 544
从 Nominal Typing:
class Bird:
def fly(self): ...
变成 Duck Typing 的静态版:
from typing import Protocol
class Flyable(Protocol):
def fly(self) -> None:
...
这是非常 Pythonic 的进化。
from typing import TypedDict
class User(TypedDict):
name: str
age: int
让 dict 也有结构类型。
这是“去 typing 冗余化”阶段。
PEP 585
以前:
from typing import List, Dict
x: List[str]
现在:
x: list[str]
巨大简化。
| 联合类型PEP 604
以前:
Optional[str]
Union[int, str]
现在:
str | None
int | str
几乎像现代语言:
解决前向引用:
class Node:
parent: Node
以前必须:
parent: "Node"
开始变得“像真正编译型语言”。
高阶函数类型:
from typing import ParamSpec
P = ParamSpec("P")
装饰器终于能正确表达:
def decorator(fn: Callable[P, T]) -> Callable[P, T]:
类型缩窄:
def is_str(x: object) -> TypeGuard[str]:
类似 TypeScript narrowing。
class Builder:
def set(self) -> Self:
return self
终于不用:
T = TypeVar("T", bound="Builder")
大事件。
PEP 695
旧写法:
T = TypeVar("T")
def identity(x: T) -> T:
return x
新写法:
def identity[T](x: T) -> T:
return x
类:
class Box[T]:
...
终于接近:
很多人认为这是 typing 2.0。
静态类型开始影响运行时。
典型:
Pydantic
class User(BaseModel):
name: str
age: int
类型不只是给 checker:
尤其和 FastAPI 一起,把 type hints 推到主流。
| 时代 | 特征 |
|---|---|
| Docstring时代 | 文档化类型 |
| PEP484时代 | 渐进静态类型 |
| 现代typing时代 | Protocol / 泛型增强 |
| PEP695+时代 | 接近完整类型系统 |
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。