ローカル変数名が関数パラメーター名と同じ場合、キーワード引数を関数に渡す
-
28-10-2019 - |
質問
これを書くためのよりサッカントの方法はありますか?
f(a=a, b=b, c=c, d=d, e=e)
背景:議論が多すぎる関数があります
f(a, b, c, d, e):
pass
私のプログラムは、関数パラメーターとまったく同じ名前のローカル変数を持っています。
a, b, c, d, e = range(5)
キーワードの引数で関数を呼び出したいと思います。変数に同じ名前が付けられているため、これが呼び出しの外観です。
g = f(a=a, b=b, c=c, d=d, e=e) # this can get very long
もちろん、このようなキーワードの代わりにポジションを使用してルーグメントを渡すことができます
g = f(a, b, c, d, e)
しかし a
, b
, c
, d
, e
この例の変数の名前にすぎず、正しい順序を簡単に確認できます。しかし、残念ながら、私のプログラムの変数はより複雑に命名されており、容易に識別できる自然秩序はありません。だから、私は間違いを避けるためにキーワードでそれらを渡すのが本当に好きです。
解決
次のようなことができます。
a, b, c, d, e = range(5)
arg_dict = lambda l: dict((k, globals()[k]) for k in l.split(', '))
arg_dict('a, b, c, d, e') => {'a': 0, 'c': 2, 'b': 1, 'e': 4, 'd': 3}
, 、そのため、このように機能を呼び出すことができます。
f(**arg_dict('a, b, c, d, e'))
これにより、使用する変数を正確に指定することができます。使用しないこのための代替方法 globals()
使用することです eval()
, 、しかし、それは潜在的に安全ではないラムダを使用することができます。
arg_dict = lambda l: dict(zip(l.split(', '), eval(l)))
合格したい場合 locals()
使用する代わりに議論として globals()
ラムダでは、以下を使用できます。
arg_dict = lambda l, d=locals(): dict((k, d[k]) for k in l.split(', '))
f(**arg_dict('a, b, c, d, e'))
ありがとう senderle のために locals()
提案。
他のヒント
locals()
あなたのローカル変数を与えてください、そうすることができます
def somewhere():
x = 3 # its a local
f(**locals()) # same as f(x=3)
しかし、あなたは確かにこれがどれほど脆弱であるかを見ることができます。
なぜここで** kwを使用できないのですか?
def foo(**kw):
for k,v in kw.items():
print k,v
foo(a=2)
foo(a=3, b=4)
foo(nonsene=True, blather=False)