python match case - 与函数返回的结果进行比较

python match case - compare to result of a function return

提问人:prosody 提问时间:7/27/2023 更新时间:7/29/2023 访问量:316

问:

我将 pysimplegui 与事件侦听器循环一起使用,将事件与函数返回进行比较。函数返回字符串 - 我可以改用 match 吗?

像这样的东西:

window = main_window()

    while True:
        event, values = window.read()

        if event == keys_and_strings.GO_SHIP_KEY():
            return process_shipments()
def BOXES_KEY(shipment):
    return f'-{shipment.shipment_name_printable.upper()}_BOXES-'.upper()

我想改用匹配大小写语句,因为,嗯,它们更漂亮?

所以我试了例如:

    match event
        case keys_and_strings.BOXES_KEY(shipment_to_edit):
            package = boxes_click(shipment_to_edit=shipment_to_edit, window=window)

但得到了(<class 'TypeError'>, TypeError('called match pattern must be a type'), <traceback object at 0x00000277B66FA4C0>)

所以在谷歌搜索之后,我尝试了:

match event: case [keys_and_strings.BOXES_KEY(shipment_to_edit)]:

但这失败了。

那么,如何使用 match case 将事件与函数调用的结果进行比较,其中函数返回一个字符串?

匹配与如果/其他的优缺点是什么?

谢谢!

python 匹配

评论

3赞 Barmar 7/27/2023
match/case用于匹配结构模式,而不是像 C/JS/PHP 那样用于相等性测试。switch/case
0赞 l -_- l 7/27/2023
你能提供MRE吗?
0赞 Mike from PSG 7/28/2023
很高兴你问了利弊。我喜欢你在寻找洞察力,而不仅仅是答案。一个缺点是使用像 match 这样的语言功能会缩小可以使用代码的潜在用户的大小。使用 意味着您的用户必须运行 Python 3.10 及更高版本。查看所有软件包的 PyPI 统计数据,71% 的用户正在使用 < 3.10。这些人将无法运行您的代码。IMO,chaces 很低,你的代码会说服某人升级,所以他们会通过。match
0赞 prosody 7/29/2023
但当然——我来这里是为了学习不要让你们做我的工作......关于版本的好点。我想我仍然处于我有理由怀疑除了我之外的任何人都会运行代码的阶段,当我清理它足够多时,他们可能会谈论 python 4 🤣
0赞 NeilG 9/22/2023
我认为 OP 是想要使用他的代码的人,@MikefromPSG,而不是“其他人”。这就像你在提倡没有人应该使用最新版本的 Python,除了它是最近的之外,没有其他原因。由于管理流程的迟钝,有很多企业 Python 用户发现很难升级。我知道有些人仍在使用 Python 2.7。我们不要拖链。

答:

1赞 Chris 7/27/2023 #1

正如评论中所指出的,这不仅仅是一种“更漂亮”的写if/else的方式。相反,它比较结构。match

def foo(): return "foo"

match "foo":
  case foo():
    print("foo!")

不仅仅是以下同义词:

def foo(): return "foo"

if "foo" == foo():
  print("foo!")

但是,以下方法可以工作:

match "foo":
  case str(): print("foo!")

我们已经匹配了匹配值为 .这就是为什么您的错误说匹配模式必须是一个类型。str

如果需要,可以使用模式匹配将名称绑定到值。例如

def foo(x):
  match x:
    case str(s): print(f"String {s}")
    case int(n): print(f"Int {n}")

您可以将“或”模式与 一起使用,但请注意,绑定的任何名称都必须与与 连接的所有模式匹配。||

评论

0赞 prosody 7/27/2023
太棒了,谢谢你的解释 - 展示它是如何被迫工作的,这很有启发性,为什么我不应该!!有没有其他语法可以避免重复“elif [value] == ...”的多次迭代,或者以某种方式对一系列 if/else 语句进行分组?
0赞 Mike from PSG 7/28/2023
是的。。。查看 Dispatchers 演示程序,了解处理事件处理的其他方法的示例。
1赞 prosody 7/29/2023
谢谢@MikefromPSG太完美了。我实际上去年支付了辅导课程的费用,我会去找特定的视频并重新观看......你是教程迈克吗?还有图书馆的制造商?非常感谢您的所有工作,更不用说为rando so问题提供支持了!大敬意 ❤️
0赞 Mike from PSG 7/29/2023
很高兴能为您提供帮助!在所有情况下都是一样的迈克。也许谢天谢地,只有一个我。非常感谢你的客气话。我很高兴您喜欢学习和使用 PySimpleGUI。帮助人们建造他们想象中的任何东西是有益的。马上回到你身边,怀着极大的敬意。💙💛
0赞 Andrey 7/27/2023 #2

你在这里完全滥用了 construciton 并将其与 . 是另一种写法,但用于模式匹配。你可以写这样的东西match-caseswitch-caseswitch-caseif-elsematch-case

match event:
    case "AMAZON_BOXES-":
        ...
    case "GOOGLE_BOXES-":
        ...

或者这个

while True:
    match window.read():
        case ("something_1", values):
            print(values)
        case ("something_2", values):
            print(values)

但是 有最简单的用法。在你的方案中,这些构造可能适用(取决于上下文)。 我建议您阅读一些指南。我个人可以推荐 Luciano Ramalho 的 Fluent Python 中的“与序列的模式匹配”部分。match-casematch-case