因为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传递
答案 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。