自 Python 3.10 起,官方引入了结构模式匹配(Structural Pattern Matching)语法,类似于其他语言中的 switch-case、模式解构(如 Rust 的 match、Haskell 的 case)等。该语法提供了一种更自然、更强大、更具结构感的条件分支机制,适用于复杂数据结构的模式匹配、结构化解析、分支逻辑优化等场景。

一、基本语法结构

结构匹配使用 match 和 case 关键字。基本语法结构如下:

match subject:
    case pattern1:
        # 代码块1
    case pattern2:
        # 代码块2
    ...

(1)subject 是要匹配的对象。

(2)每个 case 语句会尝试将 subject 与 pattern 进行匹配。

(3)匹配成功时执行对应的代码块,不会自动“贯穿”下一条 case(与 C/C++ 中 switch 不同)。

二、常见模式类型与用法举例

1、字面量模式

Literal Pattern

用于匹配代码中的,如字符串、数字、布尔值、None 等:

command = "start"

match command:
    case "start":
        print("✅ 启动")
    case "stop":
        print("⛔ 停止")
    case None:
        print("⚠ 没有命令")
    case _:
        print("⚠ 未知命令")

# 输出:✅ 启动

2、通配符模式

Wildcard Pattern

使用通配符 _ 表示匹配任意值,但不会绑定变量,常用于默认匹配:

code = 503

match code:
    case 200:
        print("请求成功")
    case 404:
        print("资源未找到")
    case _:
        print("其他错误")

# 输出:其他错误

3、or 模式

Or Pattern

用 | 将多个子模式组合为一个,表示“匹配任意一个即可”:

confirm = "y"

match confirm:
    case "yes" | "y":
        print("确认")
    case "no" | "n":
        print("取消")

# 输出:确认

适用于多个值共享同一处理逻辑的情况。

4、捕获模式

Capture Pattern

捕获模式用于将匹配到的值绑定为变量,供后续使用。

(1)单值绑定

value = 42

match value:
    case x:
        print(f"值为:{x}")

# 输出:值为:42

提示:

如果没有其他上下文,变量名会匹配任何值,因此这类 case 通常写在最后或加上条件限制。

(2)序列捕获

可以对列表、元组等序列进行结构性解包:

point = [3, 4]

match point:
    case [x, y]:
        print(f"二维坐标:({x}, {y})")

# 输出:二维坐标:(3, 4)

也支持使用 * 运算符进行序列解包:

data = [1, 2, 3, 4, 5]

match data:
    case [first, *rest]:
        print(f"第一个是:{first},剩下的是:{rest}")

# 输出:第一个是:1,剩下的是:[2, 3, 4, 5]

5、门卫模式

Guard Pattern

在 case 后使用 if 添加条件判断,控制匹配逻辑:

number = -10

match number:
    case x if x > 0:
        print("正数")
    case x if x < 0:
        print("负数")
    case 0:
        print("零")

# 输出:负数

注意: x 必须在模式中已经被捕获才能用于 if 条件中。

三、进阶技巧

1、类结构匹配

可以匹配自定义对象的结构属性(前提是该类定义了 __match_args__ 或使用 的 dataclass):

from dataclasses import dataclass

@dataclass
class Point:
    x: int
    y: int

p = Point(10, 20)

match p:
    case Point(x, y):
        print(f"点的坐标为:({x}, {y})")

# 输出:点的坐标为:(10, 20)

2、字典匹配

可以匹配字典中的键值结构,支持值绑定:

event = {"type": "login", "user": "alice"}

match event:
    case {"type": "login", "user": name}:
        print(f"{name} 已登录")

# 输出:alice 已登录

也可以用通配符 _ 忽略某些字段:

event = {"type": "login", "user": "alice"}

match event:
    case {"type": "login", "user": name}:
        print(f"{name} 登录")
    case {"type": "logout", "user": name}:
        print(f"{name} 登出")
    case _:
        print("未知事件")

# 输出:alice 登录

3、嵌套结构匹配

支持匹配嵌套结构,如嵌套的字典、列表、对象等:

data = {"user": {"name": "Tom", "age": 18}}

match data:
    case {"user": {"name": name, "age": age}}:
        print(f"{name},{age}岁")

# 输出:Tom,18岁

4、类型匹配

可用于匹配对象的类型(类构造器):

item = 3.14

match item:
    case str():
        print("是字符串")
    case int():
        print("是整数")
    case float():
        print("是浮点数")

# 输出:是浮点数

四、补充说明

1、match-case 是 3.10+ 新语法,需确保 Python 版本支持。

2、case 中变量名会绑定新值,不能与局部变量名冲突。

3、or 模式和通配符 _ 不能同时与捕获变量组合使用。

4、case 匹配顺序重要,第一个成功匹配会终止匹配过程。

5、典型应用场景

小结

结构模式匹配是一项现代化、结构化的语法特性,为 Python 引入更清晰的数据解构和分支判断机制。它不仅提升了代码可读性,也适用于多种高级编程场景,如网络协议解析、树结构遍历、命令路由、数据清洗等。

点赞有美意,赞赏是鼓励