2016-04-15 12 views
1

私はPythonにスイッチケースがなく、代わりに辞書を使用できることを理解します。しかし、もし私が引数zero()を引数に渡したいのであれば、引数を一つ()に渡したいのですか?私はこれに関連する質問は見つけられませんでした。オプションの引き数を許可するPythonスイッチケース

def zero(number): 
    return number == "zero" 

def one(): 
    return "one" 

def numbers_to_functions_to_strings(argument): 
    switcher = { 
     0: zero, 
     1: one, 
     2: lambda: "two", 
    } 
    # Get the function from switcher dictionary 
    func = switcher.get(argument, lambda: "nothing") 
    # Execute the function 
    return func() 

2つのケースに分けることなくこれを実装する最も単純な方法は何ですか?私はfunc()が(オプションの)引数を取る必要があると思いますか?

+0

どの引数は '0'で渡しますか? – AKS

+1

'lambda'または' functools.partial'が動作します。マップ内のすべての関数が、それらがすべて*使用されていなくても、同じ引数を少なくとも受け入れるように再構成します。 – jonrsharpe

答えて

1

あなたは、私はあなたが呼んでいる関数に固定引数を意味すると仮定していpartial

from functools import partial 

def zero(number): 
    return number == "zero" 

def one(): 
    return "one" 

def numbers_to_functions_to_strings(argument): 
    switcher = { 
     0: partial(zero, argument), 
     1: one, 
     2: lambda: "two", 
    } 

    func = switcher.get(argument, lambda: "nothing") 
    return func() 
1

使用することができます。

def numbers_to_functions_to_strings(argument, opt_arg="placeholder"): 
    switcher = { 
     0: lambda: zero(opt_arg), 
     1: one, 
     2: lambda: "two", 
    } 
0
:あなたは numbers_to_functions_to_stringsコールからを通じて、オプションarumentを渡すために同じアプローチを使用することができます

switcher = { 
    0: lambda: zero("not zero"), 
    1: one, 
    2: lambda: "two", 
} 

:そのような場合、単に関連する引数を指定してそれを呼び出す別の関数内の関数をラップ

ケースを正しく理解していれば、何もインポートせずにラムダを使わずにこれを行うための代替テイクがあります。あなたはちょうどあなたがすでにスイッチャーの外に持っている必要なメソッドにナビゲートすることができます

def fa(num): 
    return num * 1.1 
def fb(num, option=1): 
    return num * 2.2 * option 
def f_default(num): 
    return num 

def switch(case): 
    return { 
     "a":fa, 
     "b":fb, 
    }.get(case, f_default) # you can pass 

print switch("a")(10) # for Python 3 --> print(switchcase("a")(10)) 
print switch("b")(10, 3) # for Python 3 --> print(switchcase("b")(10, 3)) 

プリント(switchcase( "A")(10))

11.0

プリント(switchcase(」 B ")(10、3))

66.0

プリント(switchcase(" DDD」)(10))

関連する問題