为什么我的 match/case 语句对班级成员不起作用?

问题描述 投票:0回答:1

我终于使用了支持

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 语句对类成员不起作用?

python pattern-matching
1个回答
0
投票

这是根据

match
声明的规范。

PEP 622 说(斜体是我添加的):

一个捕获模式看起来像x,相当于一个相同的赋值目标:它总是匹配并绑定具有给定(简单)名称的变量。
[...]
常量值模式的工作方式与文字类似,但适用于某些命名常量。请注意,考虑到捕获模式可能存在歧义,它必须是限定(点分)名称。它看起来像 Color.RED 并且仅匹配等于相应值的值。它永远不会绑定。

这些内容将在捕获模式常值模式部分中进一步详细阐述。

这意味着:

  • 您可以匹配“普通”(或“简单”)变量的当前值
  • 您可以匹配类成员的当前值(切勿对其进行
    match
    分配)

恒定值模式的替代方案部分讨论了考虑的替代方案以及它们被拒绝的原因。

© www.soinside.com 2019 - 2024. All rights reserved.