0

インスタンスを作成するためのパラメーターとして [fname1,[parameters1],fname2,[parameters2],...] という形式のリストを取るクラスを定義しました。

アイデアは、インスタンスがリスト内のすべての関数を一度に実行し、それぞれのパラメーターを渡すことです。これはそのままで問題なく動作しますが、私が思いついた実装は信じられないほど醜いものです。次のようになります。

# (The input list is split up and transformed into two lists -
# one containing the function names as strings, the other one containing tuples)
# (It then runs a for-loop containing the following statement)

exec '%s%s'%(fname[i],repr(parameter_tuple[i]))

'fname(parameters,more_parameters,and,so,on)' を出力して実行します。

理由はわかりませんが、これをコーディングしたので、結果として、私はそれに対して本当に良い打撃を受けるに値するという考えを得ました...それは機能しますが、それほど醜くない実装が必要であることを知っています. 私がそれを見るのを手伝ってくれる人はいますか?それとも、私を少し殴るためですか?;-)

4

2 に答える 2

4

ここでの最も簡単な答えは、可能であれば、関数名ではなく関数を単純に渡し、次に単純なことを行うことです。

for function, params in zip(functions, parameters):
    function(*params)

zip()一度に 2 つのリストをループするために を使用していることに注意してください。これは、インデックスをループするよりもはるかに Pythonic なオプションです。

または、代わりに を使用しますitertools.starmap()

本当に関数を直接渡すことができない場合は、さらに難しくなります。1 つには、変数の名前に依存するソリューションは本質的に壊れやすいため、関数名から関数への明示的な辞書を作成してから関数を検索するのが最善の方法です。

それ以外の場合は、inspectモジュールを使用して必要な機能を見つけることをお勧めします。例えば:

import inspect
import sys

def some_function():
       ...

print(dict(inspect.getmembers(sys.modules[__name__], inspect.isfunction)))

プロデュース:

{'some_function': <function some_function at 0x7faec13005a0>}

ただし、これははるかに効率が悪く、回り道になることに注意してください。最良の答えは、関数自体を渡すことです。

于 2012-09-22T10:59:57.500 に答える
0

関数のリスト (関数名ではない) と引数リスト (またはタプル) のリストを取る関数を次に示します。

def callmany(funs, funargs):
    return [f(*args) for (f,args) in zip(funs, funargs)]

結果のリストを返します。結果の最初の要素は、funargs の最初の引数リストを使用して funs の最初の関数を呼び出した結果です。このような:

callmany([len, range], [["hello"], [1, 10]])
>> [5, [1, 2, 3, 4, 5, 6, 7, 8, 9]]
于 2012-09-22T11:04:52.567 に答える