努力在python中实现switch / case语句

时间:2016-09-09 17:16:41

标签: python

因为python中没有switch/case,所以我试图在我的示例程序中使用以下链接实现相同的功能: why python doesnt have switch-case

下面是我的代码:

#switch case to get the type of action to take
def action_type(action_id, dir_path):
    switcher = {
        1: func1(dir_path),
        2: func2(dir_path),
    }
    action_func = switcher.get(action_id, "Do Nothing")
    print "action_func, ", action_func
    sys.exit(0)
    return action_func()

现在它总是转到func1而不管参数是什么,即action_id传递

2 个答案:

答案 0 :(得分:2)

当你调用switcher.get(action_id, sys.exit(0))时,会在将结果传递给.get()之前评估第二个参数,这会导致程序立即终止。

答案 1 :(得分:1)

您的代码有两种破解方式,第一种方式是:

def action_type(action_id, dir_path):
    print "action id is, ", action_id

    def whatever():
        # all code here never runs

    # action_type() exits here

定义了这个内部函数whatever(),你永远不会调用它,因此它永远不会运行,然后当action_type退出时它会停止存在,所以没有别的东西可以到达它。

第二个问题是

switcher = {
   1: fun1(dir_path),
   2: func2(dir_path),
}

这在Python读取和初始化字典时(当它解析你的代码时)调用函数(它们都是),并且你不希望它们都被调用,而你不需要&#39 ;在你要求之前,他们要求他们打电话。 e.g。

test = { 
    1: len("hello")
}

# this immediately replaces `len("hello")` with the length of the string (5)

switcher.get(action_id, sys.exit(0))相同 - 这会立即调用sys.exit。

使用'头等功能'在Python中 - 传递它们而不调用它们 - 你需要使用它们的名字而不用parens。所以......

def action_type(action_id, dir_path):
    print "action id is, ",action_id

    switcher = {
        1: fun1,
        2: func2,
    }

    action_func = switcher.get(action_id, sys.exit)

    print "action_func, ", action_func
    action_func(dir_path)


action_type(1, r"c:\wherever")

在不调用它们的情况下传递函数。然后在最后打电话给你。

你仍然需要重新思考,所以你不要用dir_path调用sys.exit。