13

これをもっと簡潔に書く方法はありますか?

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) 

しかしabc、はdeこの例の変数の名前にすぎず、正しい順序を簡単に確認できます。しかし残念なことに、私のプログラムの変数はより複雑な名前が付けられており、簡単に識別できる自然な順序はありません。そのため、間違いを避けるためにキーワードで渡すのが本当に好きです。

4

3 に答える 3

6

次のようなことができます。

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()ます。

于 2011-05-02T19:16:29.137 に答える
3

locals()あなたのローカル変数を与えるので、あなたはすることができます

def somewhere():
  x = 3 # its a local
  f(**locals()) # same as f(x=3)

しかし、これがいかに脆いものであるかはお分かりいただけるでしょう。

于 2011-05-02T18:59:33.933 に答える
1

ここで **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)
于 2011-05-02T18:40:46.290 に答える