1

独自の関数の辞書を作成する Python スクリプトがあり、YARP を使用して関数名と引数を読み取って実行したいと思います (ただし、YARP の知識はこの質問には関係ありません)。

「inc」という文字列のリストを作成します。このリストには、プログラムに入力される値が入力されます。最初の項目は関数名で、リスト内のその他の文字列はすべて引数です。キーが関数名で、値が関数オブジェクトへの参照である "methods" という辞書を作成します (inspect モジュールを使用)。関数の戻り値を変数「result」に格納します。

以下のスニペットは、私が今まで使っていたものの単純化されたバージョンを示しています。これは問題なく動作しますが、複数の引数を持つ関数を処理することはできません。これを回避するために、関数にさらにパラメーターが必要な場合はリストを使用します。

if len(inc) == 1:
    result = methods[inc[0]]()   # call method with 0 arguments

elif len(inc) == 2:
    result = methods[inc[0]](inc[1])    # call method passing a string

else:
    args = []
    result = methods(inc[0])(inc[1:])    # call method passing a list

理想的には、関数が任意の数の引数を持つことができるようにこれを変更したいのですが、これを行う方法がわかりません。私は Python を初めて使用し、ドキュメントやさまざまな Web サイトを見てきましたが、解決策が見つかりません。引数のタプルを作成するなどのことを試しましたが、タプル全体を 1 つのパラメーターとして渡すことになるため、それも機能しません。

パラメータのセットを表すある種のオブジェクトを作成し、それを関数に渡すなど、この問題に対するより良い解決策はありますか? どんな提案でも大歓迎です!

4

2 に答える 2

2

https://stackoverflow.com/a/3394898/1395668を確認してください。

あなたが探している魔法は*です。これをリストに適用すると、項目が関数の引数フィールドに展開されます。

a = [ 1, 2, 3]
def myfunc(a, b, c):
    return a + b + c

print myfunc(*a)

** dict の同じアプローチについては、チェックアウトしてください

于 2012-07-17T10:32:45.107 に答える
0

このような混合構造を持つのは少し奇妙です。

inc = [func_name, arg1, arg2, ...]

2 つの別々の情報を持っている方が、はるかに自然ではないでしょうか?

func_name = ...
args = [arg1, arg2, ...]

あなたができること

methods[func_name](*args)

(通常、関数名を変数にバインドしませんが、できれば関数自体にバインドします。)

于 2012-07-17T10:32:00.340 に答える