次の関数を考えます:
_def foo(a, b, c):
pass
_
渡された引数のリスト/タプル/ dict /などを取得するにはどうすればよいですか?自分で構造を構築する必要なしに?
具体的には、JavaScriptのarguments
キーワードまたはPHPのfunc_get_args()
メソッドのPythonバージョンを探しています。
私がnotを探しているのは、_*args
_または_**kwargs
_を使用したソリューションです。関数定義で引数名を指定する必要があります(引数が渡されることを保証するため)が、関数内ではリストまたは辞書スタイルの構造でそれらを操作したいです。
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}
_
他の回答で提案されているように、関数の上部に必要な変数の辞書またはリストを作成したいです。それはより明示的であり、コードの意図をより明確な方法で私見で伝えます。
私は使うだろう *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
...
ヘッダーにパラメーターを指定しましたか?
なぜ同じ情報を本文で使用しないのですか?
def foo(a, b, c):
params = [a, b, c]
私は何を見逃しましたか?
以下を使用して、それらからリストを作成できます。
args = [a、b、c]
以下を使用して、それらから簡単にタプルを作成できます。
args =(a、b、c)
デコレータを使用する1つのソリューションは、 here です。
重複した(古い??)質問から受け入れられた回答から https://stackoverflow.com/a/582206/1136458 :
frame = inspect.currentframe()
args, _, _, values = inspect.getargvalues(frame)