在案例中使用全局变量的Python匹配/案例(可通过使用类来解决)[重复]

2023-11-22

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

match x:
    case y:
        print(...)    
    case z:
        print(...) 

事实证明这个方法行不通。
它会导致此错误:“仅最后一个 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")

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

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


我发现新的match命令(正式名称:结构模式匹配)是相当复杂的事情。花了 3 个 PEP 来记录和解释这个新的 Python 功能(PEP-634 规格, 第635章 理由 and 第636章 教程).

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

case y:并不意味着“与y正如人们所预料的那样。它是一种“捕获模式”,这意味着它总是匹配任何内容并将其存储到变量中y.

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

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在案例中使用全局变量的Python匹配/案例(可通过使用类来解决)[重复] 的相关文章

随机推荐

  • Java - 类方法可以看到同类参数的私有字段

    我遇到了一个相当奇怪的行为 不确定这是 Java 问题还是 Eclipse 的问题 采取以下代码 class Foo private String text public void doStuff Foo f System out prin
  • 无法创建 PoolableConnectionFactory(用户 ''@'localhost' 的访问被拒绝

    在过去的几天里 我一直在尝试为网络应用程序设置 DatabaseConnectionPool 但没有成功 我已经阅读了 Tomcat 文档的相关部分以及围绕该主题的大量内容 并认为我做的一切都是正确的 但显然不是因为我不断收到以下错误 Ca
  • 在 Docker 容器中运行时,JVM 无法映射保留内存

    我似乎根本无法在服务器上的 Docker 容器中运行 java 即使在发行时java version 我收到以下错误 root 86088d679103 java version OpenJDK 64 Bit Server VM warni
  • C++ 聚合没有虚函数吗?

    在 C 中 聚合是 取自语言规范的 8 5 1p1 一个数组或一个类 第 9 条 没有用户提供的构造函数 12 1 没有私有或 受保护的非静态数据成员 第 11 条 无基类 第 10 条 并且无虚函数 10 3 So 1不是一个聚合 但是
  • 无法使用 mySQL 的 root 密码登录 phpMyAdmin(在 Mac OS X Lion 上)

    因此 我尝试使用 root 密码 用户名 root 密码 登录 phpMyAdmin 但是 我仍然收到错误 2002 无法登录MySQL服务器 我非常确定我知道 root 密码 因为我在 Mac OS X 的终端中输入了以下行 sudo u
  • 警告 请求的配置文件“pom.xml”无法激活,因为它不存在

    我正在尝试运行 Maven goal validation 并不断获取 警告 请求的配置文件 pom xml 无法激活 因为它不存在 在我的 org eclipse m2e core prefs 中 activeProfiles pom x
  • window.onblur 不工作

    我似乎无法让 window onblur 正常工作 window onblur console log blur 当侦听器应用于窗口时 它仅在加载页面时运行 而不是在窗口失去焦点时运行 Ryudice 已经告诉你该怎么做 但没有解释why它
  • java读取DER格式的私钥

    我有以下代码来读取 PKCS 8 格式的私钥 public void encryptHash String hashToEncrypt String pathOfKey String Algorithm FileInputStream fi
  • 从 AVAssetWriter 读取实时 H.264 输出时数据损坏

    我正在使用一些技巧来尝试在将 AVAssetWriter 写入磁盘时读取其原始输出 当我通过连接各个文件来重新组装它们时 生成的文件与 AVAssetWriter 的输出文件的字节数完全相同 但是 重新组装的文件将无法在 QuickTime
  • 如何修复 Qt 需要 C++17 编译器?

    我使用柯南安装的Qt 6 2 2 我在 VS 2019 中创建了 Qt Widgets 项目 将语言切换为std c 17 added Zc cplusplus到附加选项 由于这是柯南安装的 QT 因此它没有Qt props 所以我手动创建
  • 每次请求时自动重新加载 wisper 监听器

    我在 app listeners 目录中有 wisper 监听器 我还有 config initializers wisper rb module Wisper def self setup configure do config conf
  • 将额外参数传递给 ggplot2 中的自定义几何图形

    我正在创建一个自定义几何图形 并希望它带有一个额外的参数 称为showpoints 这对实际情节做了一些事情或其他事情 例如 通过将其设置为 FALSE geom 实际上返回一个zeroGrob 我找到了一种方法 但是 i 它很笨重并且有点
  • OR 运算 ( || ) 与 inArray() 的性能比较

    假设您要检查用户在表单字段中输入的输入字符串 哪种方法是根据可能值列表检查此输入的最快方法 下面的例子使用jQuery 第一种方法 使用 if input firstValue input secondValue 第二种方法 使用inArr
  • 在 XAML 中设置 DataContext

    我有一个简单的应用程序 它将一些项目添加到组合框中 public partial class Window1 Window private ObservableCollection
  • Google App Engine 在没有 Maven 的情况下添加模块

    我已经浏览了很多搜索结果 但找不到我想要的东西 我已经使用appengine很长时间了 单个war目录非常好且简单 现在 Google 宣布 Appengine 模块可用于 GA 我已经阅读了所有相关内容 并且我知道它是如何工作的 我的问题
  • 如何并行运行多个DOS命令?

    如何运行多个dos命令 我有一个for循环 它运行服务器检测来检测哪个服务器正在工作并且速度很快 而且因为有更多服务器 我不希望按顺序运行所有服务器检测 而是并行运行 您可以并行执行命令start像这样 start ping myserve
  • 带误差线的点图,两个系列,轻微抖动

    我收集了多项研究的数据 对于每项研究 我都对性别变量的平均值感兴趣 以及是否存在显着差异 对于每项研究 我都有男性和女性的平均值和 95 置信区间 What I would like to do is something similar t
  • 如何在浏览器上运行node.js客户端

    everyone 我对 Node js 很陌生 我正在尝试使用node js 做一个tcp 服务器 客户端 到目前为止 一切都很好 服务器脚本可以正常运行 客户端脚本也可以正常运行 但问题是我只能通过输入命令 node client js
  • printdialog.showdialog();在 64 位 Windows 7 中不显示打印对话框

    我有带有打印工具栏项的自定义控件 打印控件时 在其他系统操作系统中运行的 64 位操作系统中 对话框不会出现在 Windows 7 中 美好的 仅在 64 位 Windows 7 中存在问题 我的问题 printdialog 没有出现在 6
  • 在案例中使用全局变量的Python匹配/案例(可通过使用类来解决)[重复]

    这个问题在这里已经有答案了 我想通过匹配变量中存储的输入来实现匹配 大小写 预期的逻辑应该是这样的 match x case y print case z print 事实证明这个方法行不通 它会导致此错误 仅最后一个 case 语句才允许