1

Pythonで、関数呼び出しを関数とその引数のリストに分割することは可能ですか?たとえば、それを取得して、またはそれに類似したものfunc(1,4,True)に変換します。[func, 1, 4, True]理想的には、これを任意の関数に対して実行したいと思います。

編集:私はプログラミングコースのTAです。これの目的は、学生がコードにどのテストケースを含めているかを確認することです。生徒がコードを適切にテストしていることを確認するために、生徒がコードをどのような値で呼び出しているかを確認したいと思います。生徒にテストを書くときに比較関数(モジュールからインポートする)を使用してもらうので、どのテストケースが含まれているかを確認するために比較関数を編集したいと思っています。

同じ最終結果を達成する方法について他のアイデアがありましたが(コードをテキストとして読み込む、学生のコードを異なる定義の新しいファイルにコピーするなどfunc)、どちらもより多くの作業を必要とし、より多くの作業が必要になります比較関数を再定義するよりも問題が発生する可能性があります。

4

3 に答える 3

3

関数呼び出しはオブジェクトではなくステートメントであるため、質問に対する直接の答えは「いいえ」です。

名前や引数などの関数に関する情報を取得するには、各関数に関連付けられているいくつかのプロパティとメソッドを使用できます。

>>> def foo(a,b):
...    print a,b
... 
>>> foo.func_name
'foo'
>>> foo.func_code.co_varnames
('a', 'b')

入力dir(funcname)すると、探索することがさらに増えます。

関数がどのように機能しているか、呼び出されたときに引数がどのように割り当てられるか、およびその他のそのような調査のトラブルシューティングについて知りたい場合は、inspectモジュールがあります。

于 2012-11-15T22:42:45.403 に答える
2

デコレータを定義するのはどうですか:

def func_call_decorator(func):
    def _wrapper(*args, **kwargs):
        ret = func(*args, **kwargs)
        return [func]+list(args)+kwargs.items() + [ret]
    return _wrapper

@func_call_decorator
def foo(a,b):
    return a+b

print foo(2,3)

これは以下を生成します:

[<function foo at 0x10045f5f0>, 2, 3, 5]

また、指定された引数に対する関数の戻り値をリストの最後の要素として添付しました。

私はあなたのユースケースは何だろう...

于 2012-11-15T23:33:47.100 に答える
1
call = [func, 1, 4, True]
f,args = call[0],call[1:]
result = f(*args)
于 2012-11-15T22:44:10.857 に答える