如何打破match语句但不打破while循环。

7

我试图在事件循环中使用匹配模式来检查值。然而,break 不仅中止了匹配模式,也中断了事件循环。

以下是代码:

while True:
    # Some code stuff here
    if event == "#PassSign":
        # Some code stuff again to check password strength
        # Display the password strength
        match strength_pass:
            case 0:
                window["#StatusPassSign"].update("No Password", visible=True)
                break
            case 1:
                window["#StatusPassSign"].update("Password Strength: Low", visible=True)
                break
            case 2:
                window["#StatusPassSign"].update("Password Strength: Medium", visible=True)
                break
            case 3:
                window["#StatusPassSign"].update("Password Strength: High", visible=True)
                break

如何在不停止事件循环的情况下中断/停止匹配过程?


6
不需要打破匹配情况。 - MB-F
如果你不想让循环中断,那么你可能不需要使用break语句。 - Phantoms
你不需要它吗?我以为是因为JavaScript需要break。 - Franky Ray
2
所以,正如已经提到的,Python中不需要使用break来匹配。另外,还有一个continue标记,它允许您在不打破循环的情况下停止迭代。 - NiziL
2个回答

8

Python中没有“fall through”,因此不需要使用尾随的break

如果你需要提前结束循环,你可以通过异常来模拟实现:

class _MyBreak(Exception): pass

foo = 5
bar = 3
try:
    match foo:
        case 5:
            if bar > 1:
                print("about to break")
                raise _MyBreak()
            print("not reached")
        case 42:
            pass
except _MyBreak:
    pass

2
这是正确的。请记住,在Python中,break语句只能属于forwhile循环。没有其他情况。 - BadZen

2

Python有许多选项可以回答这个问题,实际上有惊人的数量。

其中最直接的方法是将for循环放在一个单独的函数中。这将允许您从匹配中返回而不是中断。

window["#StatusPassSign"].update(PasswordMatch(strength_pass), visible=True)

def PasswordMatch(strength_pass):
    match strength_pass:
        case 0:
            return "No Password"
        case 1:
            return "Password Strength: Low"
        case 2:
            return "Password Strength: Medium"
        case 3:
            return "Password Strength: High"
    return ""

但是,正如我所说,有很多选择。

  1. Python允许您设置要中断的嵌套级别数量:break 2,
  2. 您可以将标志变量作为while循环的一部分添加,
  3. try-except块将允许您设置退出点,或者
  4. 您可以尝试非常晦涩的while-else结构。

我发现Python的无限制令人惊讶,最后一个仍然让我吃惊。我必须找到一个用途。

请查看以下文章,了解每种方法的示例:Python中跳出嵌套循环的5种方法


1
你确定 break 2 是有效的语法吗?我从未听说过它,而且我的 Python 3.9.7 解释器也不接受它。 - Artie Vandelay
有一个方法来完成任务,但现在我们使用C++,只是没有那么快。我们已经接近目标了,但所有的替代打包系统都不起作用 :) - nlhnt

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接