ローカル変数名が関数パラメーター名と同じ場合、キーワード引数を関数に渡す

StackOverflow https://stackoverflow.com/questions/5860974

質問

これを書くためのよりサッカントの方法はありますか?

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)
ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top