
Python 结构化模式匹配深度指南 (match/case 高级用法)本期深入探讨 match/case 的高级模式类型包括 AS 模式、OR 模式、守卫条件、在 JSON 解析和递归数据结构中的应用以及 Enum 字面量匹配。from enum import Enum, autofrom dataclasses import dataclassimport json# # 第一部分高级模式类型# # -------------------------------------------------------------------# 1. 值模式 (Value Pattern) 与枚举# -------------------------------------------------------------------class 状态(Enum):待处理 auto()处理中 auto()已完成 auto()已取消 auto()失败 auto()def 值模式匹配(当前状态: 状态):值模式使用枚举成员作为匹配目标比字符串更安全match 当前状态:case 状态.待处理:print(→ 任务等待处理)case 状态.处理中:print(→ 任务正在执行)case 状态.已完成:print(→ 任务成功完成)case 状态.已取消 | 状态.失败: # OR 模式组合print(→ 任务终止取消或失败)case _:print(→ 未知状态)值模式匹配(状态.待处理) # → 任务等待处理值模式匹配(状态.已取消) # → 任务终止取消或失败# -------------------------------------------------------------------# 2. OR 模式 (|)匹配多个备选# -------------------------------------------------------------------def OR模式匹配(值):竖线 | 连接多个模式任一匹配即可match 值:case 0 | False | None | | [] | {}:print(f→ 假值: {值!r})case 1 | True:print(→ 真值 1)case int() | float():if 值 0:print(f→ 正数: {值})else:print(f→ 非正数: {值})case str():print(f→ 字符串: {值})case _:print(f→ 其他: {type(值).__name__})OR模式匹配(0) # → 假值: 0OR模式匹配(None) # → 假值: NoneOR模式匹配(42) # → 正数: 42# -------------------------------------------------------------------# 3. AS 模式绑定子模式匹配结果# -------------------------------------------------------------------def AS模式匹配(数据):AS 模式用关键字 as 将整个匹配结果绑定到变量match 数据:case [x, y] as 整个列表:print(f→ 二元素列表 [{x}, {y}], 整体{整个列表})case [x, *rest] as 整体:print(f→ 首元素{x}, 剩余{rest}, 完整{整体})case {name: n, **rest} as 整个字典:print(f→ name{n}, 其他{rest}, 完整字典{整个字典})case str() as s:print(f→ 字符串长度 {len(s)}: {s})AS模式匹配([10, 20])# → 二元素列表 [10, 20], 整体[10, 20]AS模式匹配({name: 张三, age: 30})# → name张三, 其他{age: 30}, 完整字典{name: 张三, age: 30}# -------------------------------------------------------------------# 4. 守卫 (Guard)模式 条件过滤# -------------------------------------------------------------------def 守卫高级用法(坐标):守卫条件用 if 关键字可以使用任意布尔表达式match 坐标:case (x, y) if x 0 and y 0:print(→ 原点)case (x, y) if x 0:print(f→ Y轴上的点: y{y})case (x, y) if y 0:print(f→ X轴上的点: x{x})case (x, y) if abs(x) abs(y):print(f→ 对角线上的点: ({x}, {y}))case (x, y) if x 0 and y 0:print(f→ 第一象限: ({x}, {y}))case (x, y):print(f→ 其他位置: ({x}, {y}))守卫高级用法((0, 0)) # → 原点守卫高级用法((3, 3)) # → 对角线上的点: (3, 3)# -------------------------------------------------------------------# 5. 序列模式进阶不定长、嵌套、类型检查# -------------------------------------------------------------------def 序列模式进阶(数据):match 数据:case list() as lst if len(lst) 0:print(→ 空列表)case [first, [inner], *rest]:print(f→ 包含嵌套: 首{first}, 内层{inner}, 剩余{rest})case (a, b, c):print(f→ 三元组: ({a}, {b}, {c}))case [a, b, *rest]:print(f→ 序列: 前两个({a}, {b}), 剩余{rest})case _:print(→ 不匹配)序列模式进阶([1, [2], 3, 4])# → 包含嵌套: 首1, 内层2, 剩余[3, 4]序列模式进阶((10, 20, 30)) # → 三元组: (10, 20, 30)# # 第二部分实际应用场景# # -------------------------------------------------------------------# 6. JSON 解析优雅处理 API 响应# -------------------------------------------------------------------def 解析API响应(json字符串: str) - dict | str:try:数据 json.loads(json字符串)except json.JSONDecodeError as e:return fJSON 解析错误: {e}match 数据:case {status: 200, data: data}:print(→ API 请求成功)return datacase {status: code, error: msg}:print(f→ API 错误 [{code}]: {msg})return {error: msg, code: code}case {results: results, page: page, total: total}:print(f→ 分页数据: 第{page}页, 共{total}条)return resultscase [*items] if all(isinstance(i, dict) for i in items):print(f→ 列表结果: {len(items)}项)return itemscase _:print(f→ 未知响应格式: {type(数据).__name__})return 数据print(\n JSON 解析 )r1 解析API响应({status: 200, data: {id: 1, name: 张三}})r2 解析API响应({status: 404, error: 用户未找到})# -------------------------------------------------------------------# 7. 递归模式匹配处理树形结构# -------------------------------------------------------------------dataclassclass 树节点:值: int左: 树节点 | None None右: 树节点 | None Nonedef 遍历树(节点: 树节点 | None, 层级: int 0):前缀 * 层级match 节点:case None:print(f{前缀}null)case 树节点(值v, 左None, 右None):print(f{前缀}叶子: {v})case 树节点(值v, 左左子, 右右子):print(f{前缀}节点: {v})遍历树(左子, 层级 1)遍历树(右子, 层级 1)树 树节点(1, 树节点(2, 树节点(4), 树节点(5)), 树节点(3))print(\n 树遍历 )遍历树(树)# -------------------------------------------------------------------# 8. 表达式求值器# -------------------------------------------------------------------dataclassclass 数值:值: floatdataclassclass 加法:左: 数值 | 加法 | 乘法右: 数值 | 加法 | 乘法dataclassclass 乘法:左: 数值 | 加法 | 乘法右: 数值 | 加法 | 乘法def 求值(表达式):match 表达式:case 数值(值v):return vcase 加法(左l, 右r):return 求值(l) 求值(r)case 乘法(左l, 右r):return 求值(l) * 求值(r)表达式 乘法(加法(数值(1), 数值(2)), 加法(数值(3), 数值(4)))print(f\n 表达式求值 )print(f(1 2) * (3 4) {求值(表达式)}) # → 21# -------------------------------------------------------------------# 9. 协议解析器# -------------------------------------------------------------------def 解析消息(消息):match 消息:case [login, 用户名, 密码]:if len(密码) 6:print(f→ 登录请求: 用户{用户名})return (login_ok, 用户名)else:return (login_fail, 密码需至少6个字符)case [data, *数据包] if len(数据包) 0:print(f→ 数据包: {len(数据包)}个片段)return (data_ack, len(数据包))case [ping, 时间戳]:print(f→ Ping: 时间戳{时间戳})return (pong, 时间戳)case [quit | exit | bye]:print(→ 断开连接请求)return (bye,)case [未知类型, *_]:return (error, f未知类型: {未知类型})case _:return (error, 无效格式)print(\n 协议解析 )解析消息([login, admin, 123456])解析消息([data, b\x01, b\x02, b\x03])# -------------------------------------------------------------------# 10. 捕获模式的变量作用域陷阱# -------------------------------------------------------------------def 作用域陷阱():外部变量 外部值match 测试:case 外部变量:print(f匹配到: {外部变量})print(f外部变量被覆盖了吗? {外部变量}) # → 外部值MAX 100match 50:case x if x MAX:print(等于 MAX)case x:print(f不等于 MAX, 值是 {x})作用域陷阱()# # 总结# # 结构化模式匹配高级特性# - 值模式: 匹配枚举成员、常量用点号引用# - OR 模式 (|): 组合多个备选模式# - AS 模式 (as): 绑定子模式整体或部分# - 守卫 (if): 模式匹配后附加条件过滤# - 序列模式: 支持 * 捕获不定长部分# - 映射模式: 支持 ** 捕获剩余键值对# - 类模式: 配合 __match_args__ 解构对象属性# - 嵌套模式: 任意组合以上模式# 适用场景:# - JSON/API 响应解析、AST / 表达式求值器# - 协议解析、状态机、配置处理