6
def f1(n): #accepts one argument
    pass

def f2(): #accepts no arguments
    pass

FUNCTION_LIST = [(f1,(2)), #each list entry is a tuple containing a function object and a tuple of arguments
                 (f1,(6)),
                 (f2,())]

for f, arg in FUNCTION_LIST:
    f(arg)

ループの 3 回目では、引数を受け入れない関数に引数の空のタプルを渡そうとします。エラーが発生しますTypeError: f2() takes no arguments (1 given)。最初の 2 つの関数呼び出しは正しく機能します。タプル自体ではなく、タプルの内容が渡されます。

問題のあるリスト エントリの引数の空のタプルを削除しても、問題は解決しません。

FUNCTION_LIST[2] = (f2,)
for f,arg in FUNCTION_LIST:
    f(arg)

になりますValueError: need more than 1 value to unpack

また、リスト要素ではなくインデックスを反復処理しようとしました。

for n in range(len(FUNCTION_LIST)):
    FUNCTION_LIST[n][0](FUNCTION_LIST[n][1])

これはTypeError、最初のケースとIndexError: tuple index out of range、リストの 3 番目のエントリが の場合に同じ結果をもたらし(f2,)ます。

最後に、アスタリスク表記も機能しません。今回は への呼び出しでエラーになりますf1:

for f,args in FUNCTION_LIST:
    f(*args)

を与えTypeError: f1() argument after * must be a sequence, not intます。

試してみたいものがなくなってきました。私はまだ最初のものはうまくいくはずだと思います。誰かが私を正しい方向に向けることができますか?

4

4 に答える 4

9

このコード スニペットのコメントは、このコンテキストに関連する誤解を示しています。

FUNCTION_LIST = [(f1,(2)), #each list entry is a tuple containing a function object and a tuple of arguments
                 (f1,(6)),
                 (f2,())]

(2)(6)はタプルではなく、整数です。(2,)およびを使用して、必要(6,)な単一要素のタプルを示す必要があります。これを修正すると、ループ コードは次のようになります。

for f, args in FUNCTION_LIST:
    f(*args)

構文の説明については、Python チュートリアルの引数リストのアンパックを参照してください。*args

于 2012-08-09T12:23:42.803 に答える
3

問題は、そのような表記です:

(6)

整数値に評価され、タプルが必要なので、次のように記述します。

(6, )

アスタリスク表記は成功します。

于 2012-08-09T12:24:21.637 に答える
0

記録として、私が発見した素晴らしい代替手段は の使用ですfunctools.partial。次のコードは、私がやろうとしていたことを行います:

from functools import partial

def f1(n): #accepts one argument
    pass

def f2(): #accepts no arguments
    pass

FUNCTION_LIST = [partial(f1,2), #each list entry is a callable with the argument pre-ordained
                 partial(f1,6),
                 partial(f2)] #the call to partial is not really necessary for the entry with no arguments.

for f in FUNCTION_LIST: f()
于 2012-08-10T14:27:02.507 に答える
0

*()の代わりに渡してみてください ()。シンボルは、*それに続く iterable をアンパックするように python に指示するため、タプルが空だったので、空のタプルをアンパックし、関数には何も渡しません。

于 2012-08-09T12:23:25.837 に答える