python - 在案例中使用全局变量的 Python 匹配/案例(可通过使用类解决)
问题描述
我想通过匹配存储在变量中的输入来实现匹配/大小写。预期的逻辑应该是这样的:
match x:
case y:
print(...)
case z:
print(...)
事实证明这种方法行不通。
它会导致此错误:“仅在最后一个案例语句中才允许无可辩驳的模式”,
我认为这是因为第一个案例旁边的变量以某种方式分配给下一个要匹配的变量的值:如果我去调试,通过在“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 语句和两个新的软关键字:match 和 case。顾名思义,它可用于将给定值与指定“案例”列表进行匹配,并根据匹配采取相应行动。
for i in range(100):
match (i % 3, i % 5):
case (0, 0): print("3 and 5")
case (0, _): print("3")
case (_, 0): print("5")
case _: print(i)
• (0, 0) 模式:如果两个元素都等于 0,这将匹配一个二元素序列。
• (0, _) 模式:如果第一个元素等于0,这将匹配一个二元素序列。另一个元素可以是任何值和类型。
• (_, 0) 模式:如果第二个元素等于0,这将匹配一个双元素序列。另一个元素可以是任何值和类型。
• _ 模式:这是一个匹配所有值的通配符模式。
class Point:
x: int
y: int
def __init__(self, x, y):
self.x = x
self.y = y
def where_is(point):
match point:
case Point(x=0, y=0):
print("Origin")
case Point(x=0, y=y):
print(f"Y={y}")
case Point(x=x, y=0):
print(f"X={x}")
case Point():
print("Somewhere else")
case _:
print("Not a point")
• Point(x=0, y=0):如果 point 是 Point 类的实例并且其 x 和 y 属性等于 0,则匹配。
• Point(x=0, y=y):如果 point 是 Point 类的实例且其 x 属性等于 0,则匹配。y 属性被捕获到 y 变量,可在 case 块中使用.
• Point(x=x, y=0):如果 point 是 Point 类的实例并且它的 y 属性等于 0,则匹配。x 属性被捕获到 x 变量,可以在 case 块中使用.
• Point():如果 point 是 Point 类的实例,则匹配。
• _:始终匹配。
模式匹配可以深入研究对象属性。尽管 Point(x=0, y=0) 模式看起来像构造函数调用,但 Python 在评估模式时不会调用对象构造函数。它也不检查init () 方法的参数和关键字参数,因此您可以访问匹配模式中的任何属性值。
匹配模式也可以使用“位置属性”语法,但这需要更多的工作。(政治公众人物:634、635 和 636)
推荐阅读
- python - 数据框在另一个数据框中查找重复项,然后从该行的另一列中提取一个值
- r - 错误:row_number() 只能在数据上下文中调用
- python - 为什么这些列表没有得到修改?
- c# - 如何验证从另一个应用程序生成的 JWT 令牌?
- javascript - 如何在 React Hooks 中的状态对象内设置对象键
- node.js - Node JS - Mongoose - 如何按 ID 正确连接两个集合的结果
- c - 要求用户在 C 中输入几个数字的正确方法是什么?
- apache-knox - 访问hadoop ui(端口为50070)或hbase ui(端口为16010)时如何将URL重定向到Apache knox网关(端口为8443)?
- javascript - 如何让 JavaScript 为模式生成 n 个 var 按钮
- python-3.x - 在python中对1层深层嵌套列表求和