web-dev-qa-db-ja.com

関数に渡される引数のリスト/タプル/辞書を取得しますか?

次の関数を考えます:

_def foo(a, b, c):
    pass
_

渡された引数のリスト/タプル/ dict /などを取得するにはどうすればよいですか?自分で構造を構築する必要なしに

具体的には、JavaScriptのargumentsキーワードまたはPHPのfunc_get_args()メソッドのPythonバージョンを探しています。

私がnotを探しているのは、_*args_または_**kwargs_を使用したソリューションです。関数定義で引数名を指定する必要があります(引数が渡されることを保証するため)が、関数内ではリストまたは辞書スタイルの構造でそれらを操作したいです。

59

locals()を使用して、次のように関数内のローカル変数の辞書を取得できます。

_def foo(a, b, c):
    print locals()

>>> foo(1, 2, 3)
{'a': 1, 'c': 3, 'b': 2}
_

ただし、locals()は、関数に渡された引数だけでなく、ローカルスコープ内のすべての変数を返すため、関数の最上部で呼び出さない場合、結果必要以上の情報が含まれている可能性があります。

_def foo(a, b, c):
    x = 4
    y = 5
    print locals()

>>> foo(1, 2, 3)
{'y': 5, 'x': 4, 'c': 3, 'b': 2, 'a': 1}
_

他の回答で提案されているように、関数の上部に必要な変数の辞書またはリストを作成したいです。それはより明示的であり、コードの意図をより明確な方法で私見で伝えます。

76
Pär Wieslander

検査モジュールを使用できます。

def foo(x):
    return x

inspect.getargspec(foo)
Out[23]: ArgSpec(args=['x'], varargs=None, keywords=None, defaults=None)

これは thisthis の複製です。

7
kroger

私は使うだろう *argsまたは**kwargsおよび引数が期待どおりでない場合は例外をスローします

pythonでチェックされたものと同じエラーを取得したい場合は、

def check_arguments(function_name,args,arg_names):
    missing_count = len(arg_names) - len(args)
    if missing_count > 0:
        if missing_count == 1:
            raise TypeError(function_name+"() missing 1 required positionnal argument: "+repr(arg_names[-1]))
        else:
            raise TypeError(function_name+"() missing "+str(missing_count)+" required positionnal argument: "+", ".join([repr(name) for name in arg_names][-missing_count:-1])+ " and "+repr(arg_names[-1]))

のような何かで使用

def f(*args):
    check_arguments("f",args,["a","b","c"])
    #whatever you want
    ...
4
Xavier Combelle

ヘッダーにパラメーターを指定しましたか?

なぜ同じ情報を本文で使用しないのですか?

def foo(a, b, c):
   params = [a, b, c]

私は何を見逃しましたか?

1
Oddthinking

以下を使用して、それらからリストを作成できます。

 args = [a、b、c] 

以下を使用して、それらから簡単にタプルを作成できます。

 args =(a、b、c)

デコレータを使用する1つのソリューションは、 here です。

1
Marcelo Cantos

重複した(古い??)質問から受け入れられた回答から https://stackoverflow.com/a/582206/1136458

    frame = inspect.currentframe()
    args, _, _, values = inspect.getargvalues(frame)
1
lib