Python "switch-case"字典没有执行函数?

Python "switch-case" dictionary is not executing functions?

我遵循了很多关于如何在 Python 中创建字典来代替 switch-case 语句的示例,但由于某种原因,我的代码似乎无法正常工作。函数 ViewCommands,当输入“viewCommands”(作为命令)时,它应该像在脚本开头那样执行,但没有被执行。

ViewCommands()

while True:

    print()

    print('?>> What command would you like to execute?:')
    command = input()
    
    print('>>> Executing command: ', command)
    switcher = {
        'viewCommands': ViewCommands,
        'terminate': Terminate,
        'viewSentences': ViewSentences,
        'addSentences': AddSentences
    }
    case = switcher.get(command, '!');

    if case == '!': print('!>> INVALID INPUT - NOT AN OPTION')

当我为每个引用添加括号时...像这样:

ViewCommands()

while True:

    print()

    print('?>> What command would you like to execute?:')
    command = input()
    
    print('>>> Executing command: ', command)
    switcher = {
        'viewCommands': ViewCommands(),
        'terminate': Terminate(),
        'viewSentences': ViewSentences(),
        'addSentences': AddSentences()
    }
    case = switcher.get(command, '!');

    if case == '!': print('!>> INVALID INPUT - NOT AN OPTION')

...它确实按预期调用,但后来我遇到了一个错误,即意外调用终止,尽管它不应该在字典查询中被引用。

有谁知道我为什么会遇到这个问题?如有任何建议,我们将不胜感激,并提前致谢!

在 python 函数调用中关闭括号 ) 的那一刻,它将被执行,无论它在哪里。这就是第二段代码中发生的情况:Terminate() 正在执行,但您不希望它在那里执行。您在上一节中拥有的代码是可行的方法。 case变量赋值后,就可以执行最后加括号的函数了。


while True:

    print()

    print('?>> What command would you like to execute?:')
    command = input()
    
    print('>>> Executing command: ', command)
    switcher = {
        'viewCommands': ViewCommands,
        'terminate': Terminate,
        'viewSentences': ViewSentences,
        'addSentences': AddSentences
    }
    case = switcher.get(command, '!');

    if case == '!': 
        print('!>> INVALID INPUT - NOT AN OPTION')
    else:
        case()

PS:我无法检查代码,因为您没有提供 ViewCommands、Terminate、ViewSentences 和 AddSentences 的作用,或者它们接收哪些参数。

这是一种使其更短并避免不必要的 if 语句的方法。 Lambda 函数确实很漂亮,不是吗?

我在后面加了一个(),因为字典case语句得到的是函数对象,由后面的()执行,和lambda函数一样。

ViewCommands()

while True:

    print()

    print('?>> What command would you like to execute?:')
    command = input()
    
    print('>>> Executing command: ', command)
    switcher = {
        'viewCommands': ViewCommands,
        'terminate': Terminate,
        'viewSentences': ViewSentences,
        'addSentences': AddSentences
    }
    case = switcher.get(command, lambda: print('!>> INVALID INPUT - NOT AN OPTION'))()

直到Python3.10出来match/case声明,可以定义一个switch函数,可以让代码更可口,更容易维护:

开关函数是这样的:

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

您可以将其用于 if/elif/else ...

for case in switch(command):
    if   case('viewCommands') : ViewCommands()
    elif case('terminate')    : Terminate()
    elif case('viewSentences'): ViewSentences()
    elif case('addSentences') : AddSentences()
    else: print("bad command")

或者以更像 C 的方式...

for case in switch(command):
    if case('viewCommands') : ViewCommands()  ; break
    if case('terminate')    : Terminate()     ; break
    if case('viewSentences'): ViewSentences() ; break 
    if case('addSentences') : AddSentences()  ; break
else: print("bad command")