前言
很多 Python 核心开发者都认为 Python 不需要添加 switch-case 这种语法,因为可以通过 if/elif/else 实现一样的效果。事实上 Guido 本人也对这种语法不感冒,所以直到 Python 3.10 一个新的 match-case 才被加了进来。
这个新的语法中文叫做结构模式匹配 (Structural Pattern Matching),由于新特性内容很多所以有三个 PEP 介绍它:
PEP 634 – Structural Pattern Matching: Specification : 介绍 match 语法和支持的模式 PEP 635 – Structural Pattern Matching: Motivation and Rationale : 解释语法这么设计的理由 PEP 636 – Structural Pattern Matching: Tutorial : 一个教程。介绍概念、语法和语义
switch-case 和 match-case 的区别
拿一个小例子对比下。下面是通过 HTTP CODE 返回对应类型错误信息函数,在之前的例子中通过 if 判断要这么写:
def http_error(status):
if status == 400:
return 'Bad request'
elif status == 401:
return 'Unauthorized'
elif status == 403:
return 'Forbidden'
elif status == 404:
return 'Not found'
else:
return 'Unknown status code'
如果使用 match-case 语法:
def http_error(status):
match status:
case 400:
return 'Bad request'
case 401:
return 'Unauthorized'
case 403:
return 'Forbidden'
case 404:
return 'Not found'
case _:
return 'Unknown status code'
match 后面跟要匹配的变量, case 后面跟不同的条件,之后是符合条件需要执行的语句。最后一个 case 加下划线表示缺省匹配,如果前面的条件没有匹配上就跑到这个 case 里面执行,相当于之前的 else 。
这其实是一个典型的 switch-case 用法,如果只是这样,我也觉得确实没必要添加这个新语法,一方面代码没有做到优化,一方面缩进反而更多了。
但是 match-case 语法能做的事情远超 C/Go 这些语言里的 switch-case ,它其实是 Scala, Erlang 等语言里面的 match-case ,它支持复杂的模式匹配,接下来我会通过多个模式的例子详细演示这个新的语法的灵活性和 pythonic。
字面量 (Literal) 模式
上面的例子就是一个字面量模式,使用 Python 自带的基本数据结构,如字符串、数字、布尔值和 None:
match number:
case 0:
print('zero')
case 1:
print('one')
case 2:
print('two')
捕捉 (Capture) 模式
可以匹配 单个 表达式的赋值目标。为了演示方便,每个例子都会放到函数中,把 match 后面的待匹配的变量作为参数 (capture_pattern.py):
def capture(greeting):
match

最低0.47元/天 解锁文章
855

被折叠的 条评论
为什么被折叠?



