提问人:prosody 提问时间:7/27/2023 更新时间:7/29/2023 访问量:316
python match case - 与函数返回的结果进行比较
python match case - compare to result of a function return
问:
我将 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 将事件与函数调用的结果进行比较,其中函数返回一个字符串?
匹配与如果/其他的优缺点是什么?
谢谢!
答:
正如评论中所指出的,这不仅仅是一种“更漂亮”的写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}")
您可以将“或”模式与 一起使用,但请注意,绑定的任何名称都必须与与 连接的所有模式匹配。|
|
评论
你在这里完全滥用了 construciton 并将其与 . 是另一种写法,但用于模式匹配。你可以写这样的东西match-case
switch-case
switch-case
if-else
match-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-case
match-case
评论
match/case
用于匹配结构模式,而不是像 C/JS/PHP 那样用于相等性测试。switch/case
match