match-case语句是Python 3.10引入的结构化模式匹配语法,用于替代复杂if-elif-else链,支持类型、属性和结构匹配。

Python 中的 match 函数 和 类模式匹配(class pattern matching) 是从 Python 3.10 版本开始引入的重要特性,属于结构化模式匹配(structural pattern matching)的一部分。它通过
match-case语句实现,功能类似于传统的
switch-case,但更强大,尤其支持对对象类型、属性和结构的匹配。
什么是 match-case 语句?
match-case是 Python 3.10 引入的新语法,用于替代复杂的
if-elif-else判断链。它的基本结构如下:
match subject:
case pattern1:
# 执行代码
case pattern2:
# 执行代码
case _:
# 默认情况
其中
subject是要匹配的对象,
pattern是定义匹配规则的模式。当某个模式匹配成功时,执行对应分支。
类模式匹配:匹配实例对象
类模式允许你根据对象的类型及其属性进行匹配。这在处理多种数据类型或自定义类实例时非常有用。
立即学习“Python免费学习笔记(深入)”;
假设我们有如下类定义:
class Point:
def __init__(self, x, y):
self.x = x
self.y = y
class Circle:
def init(self, radius):
self.radius = radius
我们可以使用类模式来判断传入对象的类型并提取其属性:
网奇.NET网络商城系统是基于.Net平台开发的免费商城系统。功能强大,操作方便,设置简便。无需任何设置,上传到支持asp.net的主机空间即可使用。系统特色功能:1、同时支持Access和SqlServer数据库;2、支持多语言、多模板3、可定制缺货处理功能4、支持附件销售功能5、支持会员组批发功能6、提供页面设计API函数7、支持预付款功能8、配送价格分地区按数学公式计算9、商品支持多类别,可
def describe_shape(shape):
match shape:
case Point(x=0, y=0):
print("原点")
case Point(x, y):
print(f"坐标点 ({x}, {y})")
case Circle(radius=r) if r > 0:
print(f"圆形,半径为 {r}")
case Circle():
print("无效圆形")
case _:
print("未知形状")
说明:
- 匹配
Point(x=0, y=0)
表示对象是 Point 类型且 x 和 y 都为 0。 Point(x, y)
提取了属性值并绑定到变量 x 和 y。Circle(radius=r)
匹配 Circle 实例,并将 radius 值赋给变量 r。- 可以结合条件使用
if
(称为“守护条件”),如if r > 0
。
常见类模式写法与注意事项
以下是几种常用的类模式写法:
-
仅匹配类型:
case Point():
—— 只关心是否是 Point 类型,不提取属性。 -
提取部分属性:
case Point(x=x):
—— 只关心 x 值,y 不关心。 -
位置参数匹配(需支持):
case Point(0, 0):
—— 某些类如 namedtuple 支持按位置匹配。 -
嵌套模式:
case Point(x=Circle(radius=5)):
—— 可以嵌套复杂结构。
注意:
- 普通类默认支持关键字参数形式的模式匹配(即
attr=value
形式)。 - 若想支持位置参数匹配,类需要定义
__match_args__
属性。 - 匹配不会调用构造函数,只是检查对象属性是否符合模式。
实际应用场景举例
类模式匹配特别适合处理 API 返回的不同响应类型、事件分发、解析配置等场景。
class Success:
def __init__(self, data):
self.data = data
class Error:
def init(self, msg, code):
self.msg = msg
self.code = code
def handleresult(result):
match result:
case Success(data=d):
print(f"成功获取数据: {d}")
case Error(msg=m, code=404):
print(f"未找到资源: {m}")
case Error(msg=m, code=c):
print(f"错误 [{c}]: {m}")
case :
print("未知响应")
这种写法比多个
isinstance()判断更清晰、简洁。
基本上就这些。Python 的 match 函数结合类模式,让代码更具表达力,尤其是在处理多态数据结构时优势明显。掌握它能让你写出更现代、可读性更强的 Python 代码。









