簡體   English   中英

除了字典之外,Python中的Switch-Case替代方案

[英]Switch-Case alternative in Python except dictionary

我嵌套了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

如果我嘗試使用字典,那么它會變得低效,因為編譯器/解釋器將嘗試執行所有函數來驗證字典語法。 所以我不能使用字典。

有沒有其他優雅/優雅/ pythonic方式來完成這項任務?

您可以使用帶有函數和參數的dicts的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]()

如果您需要默認值:

from collections import defaultdict
options=defaultdict(lambda:lambda:doDefault(arg1,arg2),options)

做分支,只需要lambda做:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM