Python中match/case语句里<type>.<attr>的作用及匹配疑问
Python match语句属性匹配常见疑问解答
在Python的match语句中,case分支里的<type>(arg1=value1)会被转换成<type>(attr1=value1),以此实现属性捕获——既能捕获list实例的sort这类属性,也能匹配指定属性值。下面针对两个常见疑问逐一说明:
疑问1:为什么这段代码匹配失败?
match [1,2,3]: case list(x,sort=list.sort): print(x)
原因有两点:
- 列表解构格式错误:
list(x)这种写法是尝试匹配仅含单个元素x的列表,但目标是长度为3的[1,2,3],解构第一步就不匹配。正确的列表解构需要用括号包裹元素模式,比如list((x,*y))。 - 属性值不匹配:就算解构格式改对,
sort=list.sort也无法匹配——list.sort是类级别的未绑定方法,而列表实例的sort是绑定到该实例的方法对象,二者不是同一个对象,属性值匹配不成立。
疑问2:为什么两段代码结果不同?
匹配失败的代码
match [1,2,3]: case list.sort: print('ya')
匹配成功的代码
match list.sort: case list.sort: print('ya')
原因很直接:
- 第一段里,被匹配的对象是列表实例
[1,2,3],而case list.sort是在匹配字面量list.sort(类方法对象),两者类型、值都完全不同,自然匹配失败。 - 第二段里,被匹配的对象就是
list.sort本身,case list.sort作为字面量匹配,完全相等,所以匹配成功。
相关示例代码
捕获属性示例
match [1,2,3]: case list(sort=f): # 这不是函数调用,是属性捕获语句 print(f)
捕获列表元素与属性示例
match [1,2,3]: case list((x,*y),sort=f): # 同时解构列表元素,以及捕获sort属性到f print(x,y,f)
匹配指定属性值示例
g = list.sort match [1,2,3]: case list((1,*y),sort=g): # 检查目标列表的sort属性是否和g指向同一对象 print(y)
属性匹配与捕获综合示例
class P: def __init__(self,a,b): self.x,self.y = a+b,a-b match P(5,6): case P(x=11,y=a): # x=11是匹配属性值,y=a是捕获属性值到变量a print(a)
内容的提问来源于stack exchange,提问作者Bobby Ocean
相关产品推荐
相关产品推荐

