Python中SwitchCase的替代方法dictionary除外

2024-04-28 02:42:32 发布

您现在位置:Python中文网/ 问答频道 /正文

我嵌套了if-else语句,每个条件都调用一个不同的函数。有点像--

var = "somestring"
if var == 'call':
    if var2 == 'someothercomparison':
        return func1(arg1, arg2)
    elif var2 == 'otherway':
        return func2()
elif var == 'sms':
    return func3(arg3)
elif var == 'mail':
    return func4(arg4)

这只是一个样本数据。。还有更多的elif。在

如果我尝试使用字典,那么它将变得低效,因为编译器/解释器将尝试执行所有函数来验证字典语法。所以我不能用字典。在

有没有其他优雅/优雅/Python式的方法来完成这项任务?在


Tags: 函数returnif字典var语句call条件
2条回答

可以将函数和参数作为值使用dict的dict:

def func1(s):print(s)
def func2(s):print(s)
def func3(s):print(s)
def func4(s):print(s)

d = {"call":{'someothercomparison': (func1,"arg1"),'otherway':(func2,"arg2")},"sms":(func3,"arg3"),"mail":(func4,"func4")}

var = "call"
var2 = 'otherway'

def main(var,var2):
    f = d.get(var, {}).get(var2)
    if f:
       return  f[0](f[1])
    f = d.get(var)
    if f:
        return  f[0](f[1])
    return whatever

您可以利用字典和lambdas的组合:

options={"a":lambda:doA(arg1,arg2),"b":lambda:doB(arg3,arg4)}
options[var]()

如果需要默认值:

^{pr2}$

做分支,让lambda来做:

def branch1():
    if cond:
      doA()
    else:
      doElse(args)
options={"abc":lambda:branch1()}

相关问题 更多 >