我终于使用了支持
match
语句的 Python 版本,并且很惊讶我的 case
之一不匹配。它似乎适用于局部或全局变量,但不适用于类/对象成员。
我把它归结为这个例子:
#!/usr/bin/env python3
globl = None
class MyObj(object):
pass
def check(v):
global globl
globl = 2
m = MyObj()
m.val = 2
local = 2
match v:
case globl:
print(v, 'globl OK', globl)
match v:
case local:
print(v, 'local OK', local)
match v:
case m.val:
print(v, 'm.val OK', m.val)
check(1)
check(2)
check(3)
...给出以下输出:
tmp$ ./match-experiment.py
1 globl OK 1
1 local OK 1
2 globl OK 2
2 local OK 2
2 m.val OK 2
3 globl OK 3
3 local OK 3
看起来全局变量和局部变量是“按引用”使用的,而类成员是“按值”使用的。因此,正如我所期望的那样,普通变量被分配了匹配的值,但是类成员
case
仅当该变量的当前值等于匹配的 v
时才会执行。
为什么 match/case 语句对类成员不起作用?
这是根据
match
声明的规范。
PEP 622 说(斜体是我添加的):
一个捕获模式看起来像x,相当于一个相同的赋值目标:它总是匹配并绑定具有给定(简单)名称的变量。
[...]
常量值模式的工作方式与文字类似,但适用于某些命名常量。请注意,考虑到捕获模式可能存在歧义,它必须是限定(点分)名称。它看起来像 Color.RED 并且仅匹配等于相应值的值。它永远不会绑定。
这意味着:
match
分配)恒定值模式的替代方案部分讨论了考虑的替代方案以及它们被拒绝的原因。