2017-10-09 11 views
1

私はすでに働いていますが、長いスクリプトの部分では私の意見では美しい解決策ではありません。変数に応じてメソッドを呼び出すPythonの方法[ソリューション:辞書]

私のスクリプトは、いくつかの類似した方法を使用しています。しかし、私は、ある変数に応じてこれらのメソッドのうちの1つを呼びたいという要望に達しました。

メソッドの名前は次のように構築されています

def read_A(): 
    #doing sth 
def read_B(): 
    #doing sth else 
def read_C(): 

など

を今私はとき手紙(A、B、ニシキヘビの方法でこれらのメソッドを呼び出すしたいと思い、 C、...)が変数として与えられる。

非ニシキヘビソリューションは次のようになります。

if var == "A": 
    read_A() 
if var == "B": 
    read_B() ..... 

そして私は、私は単純に、このようにこれらのメソッドを呼び出すことができますより多くの神託の解決策を見つけることを願っています:

var = "A" 
read_var()  #This would call the method 'read_A()' 

心してください上のコードは、私がやりたいことのイメージに過ぎないと思いますが、それは実際の例ではありません!

私は私の問題を明確に述べたことを願っております、ありがとうございます!

+1

文字をキーとして、メソッドを値として辞書を作成します。 –

答えて

2

私はちょうど

if var == 'A': 
    read_a() 

を使用して問題を参照してくださいいけないが、あなたはそれがより「神託」したいのですが場合は、辞書を使用する方法にあなたの変数をマッピングし、その結果に基づいて、それを実行することができますあなたの辞書に保存されているものの:辞書で

def read_a(): 
    print('Running method read_a') 

def read_b(): 
    print('Running method read_b') 

switch = {'A': read_a, 'B': read_b} 

case = 'A' 
switch.get(case)() 
>> 'Running method read_a' 
case = 'B' 
switch.get(case)() 
>> 'Running method read_b' 
+0

コードは実際にifを使って動作していますが、多くのことが必要であり、エレガントな方法で短縮する方法があるかどうかを知りたいと思います。 – yfro

+0

うまくいけば、このコードは十分にエレガントで、 if文がたくさんあります。 – AK47

1

スティック機能、および辞書を使用して選択したものに派遣します

read = {'A': read_a, 'B': read_b, 'C': read_c} 
choice = 'A' 
read[choice]() 

最後の行では、辞書に表示されている選択肢に一致する関数を検索し、すぐに呼び出します。

1

巨大な辞書を書くのではなく、read_a、read_b ...という名前の関数がたくさんある場合、このようにすることができます。 )(

def execute_func(x): 
    return { 
     '0':read_A(), 
     '1':read_B() 
    }[x] 

代わりに '0' と '1' 以上のあなたの変数を設定し、execute_funcためにあなたのparamsを渡す:

def read_a(): 
    print('Running method read_a') 

def read_b(): 
    print('Running method read_b') 

def read_c(): 
    print("running method read_c") 

def read_d(): 
    print("running method read_d") 

............ 
............ 

def read_z(): 
    print("running method read_z") 

def _read_var(var): 
    method = "read_{}".format(var.lower()) 
    try: 
     eval(method)() 
    except NameError: 
     raise NotImplementedError 

var = "A" 
_read_var(var)# will invoke read_a method 
+1

が面白そうです。それを試してみましょう。どうも! – yfro

1

あなたは次の構造を使用することができます。

+1

これはread_Aとread_Bの両方を実行し、選択されたものの解を返すだけです。 '} [x]'の後ろに括弧を入れて置きます。 – Adirio

+0

私はそれを試してみました。これは本当に役立ちます – yfro

関連する問題