【问题标题】:"Switch/case" statement executes all possible statements in Python“switch/case”语句执行 Python 中所有可能的语句
【发布时间】:2020-08-19 00:10:23
【问题描述】:

我在我的代码中实现了第二个 switch case 语句,但由于某种原因,一个有效,另一个无效。

有问题的损坏是这样的:

def graph_add_depend(caseSelected, graph, data):
switcher = {
    1: graph.addFullNC(data[1], data[0]),
    2: graph.addFullNC(data[0], data[1]),
    0: graph.addFullNC2(data[0], data[1])
}.get(caseSelected, print("Something went wrong: GAD 44"))

我是这样称呼它的:

graph_add_depend(is_added, graph, temp)

当我执行代码时,它不会转到正确的情况,但会执行其中的每一个:也就是 1 然后 2 然后 0

有没有办法解决这个问题。靠着上帝的爱,我找不到问题所在。 对我来说最令人沮丧的是,在我看来,有效的 switch 语句和这个坏掉的语句实际上是一样的......

【问题讨论】:

  • 请提供minimal reproducible example,以及当前和预期的输出。
  • 请记住:Python 中的 all 表达式是热切求值的 (短路时的 RHS 除外)。这包括字典中使用的值。
  • 当键/值的值部分不重要(唯一的函数调用)时,为什么还要编写这样的代码?
  • 这不是一个 switch/case 语句。 python中没有开关/案例。您正在构建字典。
  • @jarmod 我不知道你的意思,但它从一个类中调用一个方法,

标签: python switch-statement


【解决方案1】:

如果您不想调用函数,除非它匹配大小写,请不要在构建字典时调用它。将每个案例包装在 lambda 中是延迟评估的一种非常简单的方法:

def graph_add_depend(caseSelected, graph, data):
    return {
        1: lambda: graph.addFullNC(data[1], data[0]),
        2: lambda: graph.addFullNC(data[0], data[1]),
        0: lambda: graph.addFullNC2(data[0], data[1])
    }[caseSelected]()

请注意,如果caseSelected 不是有效选项,这将自动引发KeyError;引发异常通常比打印消息但不返回任何内容更好。

【讨论】:

  • 是的,玩了一会儿,添加lambda: 并用[caseSelected]() 替换.get(caseSelected, print("Something went wrong: GAD 44")) 似乎可以解决问题。需要 Bolth,谢谢。
【解决方案2】:

您可以使用此函数定义模拟 switch 语句:

def switch(v): yield lambda *c: v in c

使用它会让你的代码更清晰:

for case in switch(caseSelected):

    if case(1):
        graph.addFullNC(data[1], data[0])
        break

    if case(2):
        graph.addFullNC(data[0], data[1])
        break

    if case(0): 
        graph.addFullNC2(data[0], data[1])
        break
else:
    print("Something went wrong: GAD 44"))

您也可以将它与 if/elif/else 模式一起使用而无需中断:

for case in switch(caseSelected):

    if   case(1):
         graph.addFullNC(data[1], data[0])

    elif case(2):
         graph.addFullNC(data[0], data[1])

    elif case(0): 
         graph.addFullNC2(data[0], data[1])

    else:
         print("Something went wrong: GAD 44"))

【讨论】:

    最近更新 更多