在python中切换替代方案

时间:2016-08-23 09:14:08

标签: python python-2.7

尝试这一小段代码,可以替代交换机。但是我得到了错误。

def main(x):

    x = x.split(' ')
    return {'Function1' : Function1(x),
            'Function2' : Function2(x),
            }[x[0]]


def Function1(x):
    var1 = x[0]
    var2 = x[1]

def Function2(x):
    print x[0]

main("Function1 10")

现在上面的代码工作正常。问题是如果我将Function2作为键传递而没有任何主函数参数,它会自动进入Function1并抛出列表超出范围错误。

main("Function2")

先谢谢。

3 个答案:

答案 0 :(得分:3)

您的代码根本不起作用。在定义dict时总是调用函数。你应该在dict中保持callable并调用结果。

def main(x):
    x = x.split(' ')
    func = {'Function1' : Function1,
            'Function2' : Function2,
           }[x[0]]
    return func(x[1])

答案 1 :(得分:1)

代码块

    return {'Function1' : Function1(x),
        'Function2' : Function2(x),
        }[x[0]]

首先评估为

    return {'Function1' : Function1(x),
        'Function2' : Function2(x),
        }

评估此内容实际上会同时调用Function1Function2

你想要的是获得对正确功能的引用而不实际调用它,直到你知道要调用哪一个:

    return {'Function1' : Function1,
        'Function2' : Function2,
        }[x[0]](x)

答案 2 :(得分:0)

您真正应该做的是使用一串if/elif/else语句:

if x == 1:
    Function1()
elif x == 2:
    Function2()
else:
    Function3()