Python 3.11 引入了一个新特性,称为“结构化模式匹配”(Structured Pattern Matching),它受到了 Haskell 和 Rust 等语言中的模式匹配特性的启发。这个特性允许开发者使用更简洁和可读性更强的语法来处理不同的情况,类似于 switch-case 语句在其他语言中的作用。
以下是 Python 3.11 中模式匹配的基本语法和使用示例:
基本语法
match subject:
case <pattern_1>:
<action_1>
case <pattern_2>:
<action_2>
case <pattern_3>:
<action_3>
# ...
case _:
<default_action>
示例
下面的示例展示了如何使用模式匹配来处理不同类型的输入:
def http_error(status):
match status:
case 400:
return "Bad request"
case 404:
return "Not found"
case 418:
return "I'm a teapot"
case _:
return "Something's wrong with the internet"
# 使用模式匹配
result = http_error(404)
print(result) # 输出: Not found
模式匹配的类型
- 字面量模式:直接匹配字面量值。
match point:
case (0, 0):
print("Origin")
case (0, y):
print(f"Y={y}")
case (x, 0):
print(f"X={x}")
case (x, y):
print(f"X={x}, Y={y}")
- 捕获模式:可以捕获匹配到的值。
match point:
case (x, 0):
print(f"X axis, X={x}")
case (0, y):
print(f"Y axis, Y={y}")
case (x, y):
print(f"Neither axis, X={x}, Y={y}")
- 常量模式:匹配特定的常量值。
match point:
case (0, 0):
print("Origin")
case (_, 0):
print("On the x axis")
case (0, _):
print("On the y axis")
case (_, _):
print("Somewhere else")
- 序列和映射模式:可以用来匹配序列(如列表、元组)和映射(如字典)。
match point:
case [x, y]:
print(f"List: X={x}, Y={y}")
case (x, y):
print(f"Tuple: X={x}, Y={y}")
case {"x": x, "y": y}:
print(f"Dictionary: X={x}, Y={y}")
- 类模式:可以匹配类的实例,并且可以提取属性。
class Point:
x: int
y: int
def where_is(point):
match point:
case Point(x=0, y=0):
print("Origin")
case Point(x=0, y=y):
print(f"Y={y}")
case Point(x=x, y=0):
print(f"X={x}")
case Point():
print("Somewhere else")
p = Point()
p.x = 10
p.y = 20
where_is(p) # 输出: Somewhere else
结构化模式匹配是一个强大的新特性,使得处理复杂的数据结构更加简洁和直观。