2017-09-05 9 views
0

値を関数にしたいが予期せぬ動作が発生したOrderedDictがある。初期化:Python dict/OrderedDict:関数を即座に実行せずに値に代入する

from collections import OrderedDict 

options_dict=OrderedDict(["A",call_func_A(arg1,arg2)], 
         ["B",call_func_B(arg1,arg3)], 
         ["C",call_func_C(arg1,arg4)] 

# Select options 
options=["A","C"] 

# Execute 
result={} 
for opt in options: 
    result[opt]=options_dict[opt] 

# Return result (or whatever) 
print result 

機能call_func_A、call_func_Bとcall_func_Cはoptions_dictが、むしろオプションをループのために、後続に比べて、宣言されたときに実行することが判明します。

私は関数呼び出しがforループまで待つことを望みます。

何が起こっているのですか?

+1

'call_func_A'は関数で、' call_func_A(arg1、arg2) 'は関数を呼び出しています。 –

答えて

0

まず、OrderedDictを間違って宣言しています。コンストラクタはタプルのリストを予期します。代わりに、複数のリストを提供しています。あなたがそれらを呼んでいる

options_dict=OrderedDict(["A",call_func_A(arg1,arg2)], 
         ["B",call_func_B(arg1,arg3)], 
         ["C",call_func_C(arg1,arg4)]) 

options_dict=OrderedDict([("A",call_func_A(arg1, arg2)), 
          ("B",call_func_B(arg1, arg3)), 
          ("C",call_func_C(arg1, arg4))]) 

第二に、あなたはoptions_dictを宣言するとき、あなたは辞書の値としての機能を渡すのではなく、その結果はありません。そうのようにそれを実行します。 call_func_A(arg1, arg2)によってを実行します。それを回避する1つの比較的簡単な方法は、引数を省略してある。

options_dict=OrderedDict([("A",call_func_A), 
         ("B",call_func_B), 
         ("C",call_func_C)]) 

あなたは二OrderedDictに引数を格納することができます:

args_dict=OrderedDict([("A",[arg1, arg2]), 
         ("B",[arg3, arg4]), 
         ("C",[arg5, arg6])]) 

し、それらを呼び出すために:

result={} 
for opt in options: 
    result[opt]=options_dict[opt](*args_dict[opt]) 
3

関数は、辞書が作成される前に呼び出されます。あなたは電話をした。

ただし、後から呼ばれるように、別の関数内にネストすることによって、関数呼び出しを延期することができます

options_dict = OrderedDict([("A", lambda: call_func_A(arg1,arg2)), 
          ("B", lambda: call_func_B(arg1,arg3)), 
          ("C", lambda: call_func_C(arg1,arg4))]) 

# Select options 
options = ["A", "C"] 

# Execute 
result = {} 
for opt in options: 
    result[opt] = options_dict[opt]() # <- call 

を同じ効果を実行するために余分なimport文で、functools.partialで達成することができます。

あなたの関数の引数がおそらくの不変であるので、ここでは呼び出しが行われたときは私は思いません。ディクテーション作成時に呼び出される関数を持つという初期のアプローチを保つこともできます。

+0

遅延の理由は比較的高価なので、サブセットを(順番に)呼び出したいだけです。おそらくもっと簡単な方法があります。 – jtlz2

+0

現時点で私はTypeError:1つの引数が最大で3つあります。 – jtlz2

+0

@ jtlz2 Moses Koledoyeが提供しているコードは正しいです。問題は、OrderedDictの作成方法にあります。私の答えの最初の部分を正しい方法で確認してください。 – stybl

関連する問題