惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

L
LangChain Blog
月光博客
月光博客
S
SegmentFault 最新的问题
博客园 - 三生石上(FineUI控件)
Last Week in AI
Last Week in AI
J
Java Code Geeks
酷 壳 – CoolShell
酷 壳 – CoolShell
TaoSecurity Blog
TaoSecurity Blog
V
Visual Studio Blog
博客园 - 叶小钗
Threat Intelligence Blog | Flashpoint
Threat Intelligence Blog | Flashpoint
T
Threat Research - Cisco Blogs
罗磊的独立博客
雷峰网
雷峰网
T
Tor Project blog
L
LINUX DO - 最新话题
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
博客园 - 司徒正美
Apple Machine Learning Research
Apple Machine Learning Research
Scott Helme
Scott Helme
Spread Privacy
Spread Privacy
C
CERT Recently Published Vulnerability Notes
腾讯CDC
Cloudbric
Cloudbric
WordPress大学
WordPress大学
Security Archives - TechRepublic
Security Archives - TechRepublic
V
V2EX
OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
N
News and Events Feed by Topic
T
Troy Hunt's Blog
T
Threatpost
C
Check Point Blog
Vercel News
Vercel News
I
Intezer
Engineering at Meta
Engineering at Meta
C
Cybersecurity and Infrastructure Security Agency CISA
D
DataBreaches.Net
SecWiki News
SecWiki News
Help Net Security
Help Net Security
Microsoft Azure Blog
Microsoft Azure Blog
Google DeepMind News
Google DeepMind News
S
Secure Thoughts
T
The Blog of Author Tim Ferriss
The GitHub Blog
The GitHub Blog
Hacker News: Ask HN
Hacker News: Ask HN
AI
AI
N
News and Events Feed by Topic
阮一峰的网络日志
阮一峰的网络日志
B
Blog RSS Feed
Attack and Defense Labs
Attack and Defense Labs

博客园 - 悠哉大斌

AI Agent 安全沙箱技术对比:E2B、Cube Sandbox 与 Docker Sandboxes linux 升级 claude code的坑 debian(WSL) apt 代理配置 linux内核之Namespaces、Cgroups、Capabilities、Seccomp和Landlock 大语言模型推理中的隐藏瓶颈及其解决方法 Docker Sandboxes 技术是什么,和docker容器有什么区别 什么是 Docker Agent以及一个Docker Agent示例 windows wsl 安装 Temurin® JDK claude Code 和 codex 作为编程代理,前者使用typescript开发,后者使用rust,他们的决策依据是什么 Java 并发编程发展史与 java.util.concurrent 全景解析 LLM 真的改变了编码风格吗? 如果人工智能会犯错且不精确,为什么它正在改变世界? Python 的协程模型和 JavaScript 的 async/await python闭包和function.__closure__特殊属性 python 的 dunder name和 sunder name 基于nodejs设计REST API的知名开源框架 windows上使用node-oracledb Thick 模式连接 Oracle 11g Claude Code CLI连接 DeepSeek V4模型后调用报400错误 python里对象(object)到底是什么 Python 泛型演变史 Python 类型提示的演变史 PEP 593 新增的Annotated 类型 Alibaba AgentScope 和 microsoft agent framework 详细对比分析 spring AI Alibaba Agent Framework 和 agentscope有什么区别和联系 AI Agent协作模式以及主流开源框架对协作模式的支持 Tailscale 是如何接管 DNS 的? Agent = Model + Harness 使用rust编写typescript编译器的难点在什么地方,哪些数据结构是rust不擅长的? TypeScript/JavaScript 中的异步迭代语句 js中的生成器函数 Tailscale Serve and Funnel openclaw gateway的网络绑定模式 websocket协议和http协议有何依赖关系? MCP通信的双方是谁? claude code MCP 安装范围 如何在wsl2环境下给claude code cli 配置 playwright-mcp wsl的网络模式有哪几种,有哪些区别? AI Agent memory是什么? ai agent skills是什么? Go测试生态系统工具与最佳实践深度调研(聚焦认证授权系统) 线性代数中常见矩阵类型的概念关系思维导图 三种主流授权策略
Python 类型别名的演变
悠哉大斌 · 2026-04-23 · via 博客园 - 悠哉大斌

类型别名(Type Alias)在 Python typing 演进里是条很有意思的支线,因为它经历了 隐式别名 → 显式别名 → 新语法别名 三个阶段。


Python 类型别名的演变

1 最早:隐式类型别名(PEP 484时代)

最初根本没有专门语法。

只要把类型赋值给变量,就是别名:

Vector = list[float]

然后:

def magnitude(v: Vector) -> float:
    ...

Vector 只是:

list[float]

的名字。


为什么需要别名

否则复杂类型会变成噩梦:

dict[str, list[tuple[int, str | None]]]

改成:

UserMap = dict[str, list[tuple[int, str | None]]]

可读性高很多。


JSON 类型经典例子

JSON = (
    dict[str, "JSON"]
    | list["JSON"]
    | str
    | int
    | float
    | bool
    | None
)

这个几乎是教科书案例。


2 问题:变量还是别名?

麻烦在于:

Config = dict[str, str]

这是:

  • 类型别名?

还是:

  • 一个变量值?

静态检查器要猜。

很不优雅。


3 PEP 613:TypeAlias(显式声明)

PEP 613

Python 3.10:

from typing import TypeAlias

Vector: TypeAlias = list[float]

现在明确告诉类型检查器:

这是 alias,不是变量。


好处一:消除歧义

以前:

MyType = "ClassName"

是字符串变量?

还是前向引用别名?

不清楚。

现在:

MyType: TypeAlias = "ClassName"

明确。


好处二:泛型别名

from typing import TypeVar, TypeAlias

T = TypeVar("T")

Vec: TypeAlias = list[T]

很漂亮。


好处三:类型检查更好

mypy / Pyright 能报更准确错误。

比如:

Alias: TypeAlias = 42

会报错。

因为不是合法类型。


4 PEP 695:新一代 type 语句(Python 3.12)

大升级。

PEP 695

现在:

type Vector = list[float]

不是赋值。

是真正类型声明。

像:

  • TypeScript
type Vector = number[]
  • Rust
type Vector = Vec<f64>;

Python 第一次有正式 type statement。


泛型别名更优雅

旧:

T = TypeVar("T")
Vec = list[T]

新:

type Vec[T] = list[T]

这个非常漂亮。


条件类型组合也更舒服

type Response[T] = T | Exception

递归别名

以前很痛苦:

JSON = dict[str, JSON] | ...

新语法支持更自然。


5 TypeAlias vs NewType(常被混淆)

这个必须讲。

TypeAlias

只是换名字:

type UserId = int

本质:

UserId is int

没区别。


NewType

NewType

from typing import NewType

UserId = NewType("UserId", int)

这是静态层面新类型:

user: UserId

不能随便拿 ProductId 混进来。


举例

坏:

type UserId = int
type ProductId = int

类型检查器认为一样。


好:

UserId = NewType("UserId", int)
ProductId = NewType("ProductId", int)

不会混。

这很适合领域建模。


6 三代演化总结

阶段 写法
PEP 484 Vector = list[float]
PEP 613 Vector: TypeAlias = list[float]
PEP 695 type Vector = list[float]

很明显是:

从约定
到显式标注
到语言语法


强调一点

类型别名不是“缩写”。

它本质是:

  • 可读性工具
  • 抽象边界
  • 领域建模工具

比如:

type Money = Decimal
type Email = str
type UserRecord = dict[str, str | int]

这已经有 DSL 味道了。