私が達成したいこと:
dct = {'foo':0, 'bar':1, 'baz':2}
def func(**dct):
pass
#function signature is now func(foo=0, bar=1, baz=2)
ただし、**構文は、dictの展開(やりたいこと)とキーワード引数を保持するパラメーターの宣言(やりたくないこと)の間で明らかに衝突しています。
これは可能ですか?
要件の私の解釈に基づいてdict
(実行時に提供されるコンテンツと一致するシグネチャを使用して関数を動的に定義する必要があります)、ここには2つの問題があり、実用的ではありません。
dict
sは順序付けられていないため、位置引数を定義するために確実に使用することはできませんこれはXY問題だと思います。あなたが達成しようとしていることを説明することができれば、おそらく私たちはより良い助けになることができます。
ただし、デフォルトのキーワード引数を使用して割り当てようとしていると仮定dict
すると、これを実現する1つの方法は、デコレータを使用することです。例えば:
def defaultArgs(default_kw):
"decorator to assign default kwargs"
def wrap(f):
def wrapped_f(**kwargs):
kw = {}
kw.update(default_kw) # apply defaults
kw.update(kwargs) # apply from input args
f(**kw) # run actual function with updated kwargs
return wrapped_f
return wrap
次に、このデコレータを使用して、キーワード引数のみを期待する関数にデフォルトのキーワード引数を割り当てることができます。
defaults = {'foo':0, 'bar':1, 'baz':2}
@defaultArgs(defaults)
def func(**kwargs):
print kwargs # args accessible via the kwargs dict
結果:
func() # prints {'baz': 2, 'foo': 0, 'bar': 1}
func(foo=2) # prints {'baz': 2, 'foo': 2, 'bar': 1}
params = {'bar':1000, 'hello':'world'}
func(**params) # prints {'baz': 2, 'foo': 0, 'bar': 1000, 'hello': 'world'}
位置引数は使用できないことに注意してください。
func(1, 2, 3) # raises TypeError
あなたが私が信じたいのはeval()
リンクです
私が同様の質問にした答え:https ://stackoverflow.com/a/11865190/1561176
あなたがここで何を成し遂げようとしているのか、私にはよくわかりません。次の作品(一種):
def func(**dct):
pass
dct = {'foo':0, 'bar':1, 'baz':2}
func(**dct)
をどのように使用する予定ですかfoo
、bar
またはbaz
動的に作成される場合は関数で使用する予定ですか?あなたが実際に達成しようとしていることについてもう少し詳しく教えていただければ、もう少し役立つかもしれません。