Python 3.10里面的Match-Case语法详解

前言

很多 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
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值
>