2017-12-30 24 views
-3

私は実行すべき関数を持つタプルを作成しようとしています。私はラムダ関数をdecladePythonラムダ関数の引数の問題

私のコードは、次のようになります。私はtuple1とtuple2を使用

if opt in ("-u", "--usage"): 
    func = lambda x : MyCpu_Usage(x) 
    tuple1 += (func,) 
    tuple2 += (arg,) 
elif opt in ("-f", "--frequency"): 
    func = lambda x : MyCpu_freq(x) 
    tuple1 += (func,) 
    tuple2 += (arg,) 

とコード、:

iter = 0 
for item in tuple1: 
    item(tuple2[iter]) 
    iter += 1 

問題は、であるために機能すると私のタプルサイクル(アイテムとして)は引数を許可しません。タプル内で[iter]が正しく設定されています。 あなたの返信ありがとうございます。

編集:コードを更新しました。私の質問は:**なぜアイテム(tuple2 [iter])は機能しませんか?関数は呼び出しますが、引数はありません。 **

+5

「tuple1」と「tuple2」はどれも同じになります。また、それはあなたのようなタプルを使っているのは奇妙です - そしてそのラムダ全体 - あなたは単に 'MyCpu_Usage'を使うかもしれません - あなたがやろうとしていることは何ですか? –

+0

@JonClements私はコードと質問を更新しました。 –

+0

これは本当にあなたの後ろに 'argparse'組み込みライブラリがあり、引数に基づいて呼び出す適切な関数を設定し、残りの解析された引数をその関数に渡します... –

答えて

0

あなたの質問は少し不完全です。しかし、私はあなたがいくつかの関数呼び出しを持っていると仮定し、すべての関数呼び出しはちょうど1つのパラメータで動作します。この場合

、あなたが(彼らはより簡単に拡張するよう、リストであるべきである)あなたのタプルを圧縮することができます

n = -1 
for n, (func, arg) in enumerate(zip(tuple1, tuple2)): 
    func(arg) 
n += 1 # to get the same base as you – number of calls made 

それが既に含まれている一つだけのリストを持っている、しかし、より実用的になりますペアが作られる呼び出します。この場合

calls = [] 
… 
func = lambda x : MyCpu_Usage(x) 
calls += [(func, arg)] 
# or just 
calls += [(MyCpu_Usage, arg)] 
… 
n = -1 
for n, (func, arg) in enumerate(calls): 
    func(arg) 
n += 1 # to get the same base as you – number of calls made 

を、callsと呼ばれるリスト内のすべてのリストエントリは、呼び出される関数とその引数との2要素のタプルです。各ループ実行では、1番目のタプル要素で0番目のタプル要素を呼び出すことによってエントリが処理されます。

あなたはエントリーが自己完結したい場合は、

calls = [] 
… 
calls += [lambda: MyCpu_Usage(arg)] # arg being the same you had before 
… 
n = -1 
for n, call in enumerate(calls): 
    call() 
n += 1 # to get the same base as you – number of calls made 

argが、この場合には、閉鎖されていること、しかし、注意してください行うことができます。つまり、再割り当てして再使用すると、使用するすべてのラムダで変更されます。この場合、次のようにすることができます:

def new_lambda(target, *args, **kwargs): 
    return lambda: target(*args, **kwargs) 

calls = [] 
… 
calls += [new_lambda(MyCpu_Usage, arg)] 
… 
n = -1 
for n, call in enumerate(calls): 
    call() 
n += 1 # to get the same base as you – number of calls made 
関連する問題