6

私が達成したいこと:

dct = {'foo':0, 'bar':1, 'baz':2}
def func(**dct):
    pass
#function signature is now func(foo=0, bar=1, baz=2)

ただし、**構文は、dictの展開(やりたいこと)とキーワード引数を保持するパラメーターの宣言(やりたくないこと)の間で明らかに衝突しています。

これは可能ですか?

4

3 に答える 3

7

要件の私の解釈に基づいてdict(実行時に提供されるコンテンツと一致するシグネチャを使用して関数を動的に定義する必要があります)、ここには2つの問題があり、実用的ではありません。

  1. 引数が実行時に定義されている場合、関数はどのように変数を参照できますか?実行時にも関数本体を作成する予定ですか?
  2. dictsは順序付けられていないため、位置引数を定義するために確実に使用することはできません

これは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
于 2012-08-14T15:42:34.603 に答える
0

あなたが私が信じたいのはeval() リンクです

私が同様の質問にした答え:https ://stackoverflow.com/a/11865190/1561176

于 2012-08-14T14:05:54.110 に答える
0

あなたがここで何を成し遂げようとしているのか、私にはよくわかりません。次の作品(一種):

def func(**dct):
    pass

dct = {'foo':0, 'bar':1, 'baz':2}
func(**dct)

をどのように使用する予定ですかfoobarまたはbaz動的に作成される場合は関数で使用する予定ですか?あなたが実際に達成しようとしていることについてもう少し詳しく教えていただければ、もう少し役立つかもしれません。

于 2012-08-14T14:09:35.090 に答える