Python 匹配/大小写在 case 中使用全局变量(可通过使用类来解决)

101*_*is5 10 python class case match

我想通过匹配变量中存储的输入来实现匹配/大小写。预期的逻辑应该是这样的:

match x:
    case y:
        print(...)    
    case z:
        print(...) 
Run Code Online (Sandbox Code Playgroud)

事实证明这个方法行不通。
它会导致此错误:“仅在最后一个 case 语句中才允许不可反驳的模式”,
我相信会发生这种情况,因为不知何故,第一个 case 旁边的变量被分配给下一个匹配的变量的值:如果我去调试,通过在“case y”行中,y 的值更改为 x 中存储的值。

但是,如果一切都属于一个类,则不会发生这种情况,如下所示:

class Vars:
    x = int(input())
    y = int(input())
    z = int(input())
match Vars.x:
    case Vars.y:
        print("something")
    case Vars.z:
        print("anything")
Run Code Online (Sandbox Code Playgroud)

这种方法不会导致任何错误。

这是为什么?我的意思是,是什么让类变量成为可反驳的模式?

VPf*_*PfB 14

我发现新match命令(正式名称:结构模式匹配)相当复杂。需要 3 个 PEP 来记录和解释这个新的 Python 功能(PEP-634 规范635 基本原理636 教程)。

我认为自己是这个话题的新手,但想回答这个问题。那么,为什么case y:不工作并且case Vars.y:工作得很好呢?

case y:并不y像人们所期望的那样意味着“与”比较。它是一个“捕获模式”,这意味着它总是匹配任何内容并将其存储到变量中y

Python 将始终匹配的模式称为“无可辩驳”,并对其有一些特殊的规则。简而言之:任何无可辩驳​​的模式都必须是最后一个(这是问题中提到的错误的根源)。但正如我所解释的,即使纠正了这个错误,它也无法工作。

另一方面,case Vars.y是一种“价值模式”;这个点就很重要。顾名思义,它的意思是“与这个值比较”。

还有许多其他图案类型。综上所述,仅凭直觉很难理解匹配规则。我并不是指一些晦涩的细节。推荐一个好的教程(例如 PEP-636)。