2016-05-11 4 views
0

呼び出しようとしている関数のキーワード引数に位置引数をマップする明確な方法はありますか?重要ワード引数への位置引数のマッピング

例えば、私は

def test(a, b=None, c=None):

下の関数を呼び出すために、私は私がa1を受けることを知っている

test(*args, **kwargs)

に渡しますについてです。

*args{a: 1}にマップする一般的な方法はありますか?

これは私がちょうどに渡されている引数を決定するために**kwargsを使用することができるようになる。

+0

あなたは 'args' *または*' kwargs'を持っていません。あなたは*明示的に名前付きの*パラメータを持っています。 'b 'が提供されているかどうかを知りたければ、' bがNoneであれば 'を使用します。 – jonrsharpe

+0

申し訳ありませんが私の質問を洗練させてください。その部分がはっきりしていないことに気付きました。 –

+0

パラメータがどのように渡されるかはどうして重要ですか?機能の中に入ると、あなたが受け取ったものを簡単に知ることができます。もっと文脈を与えることができますか? – jonrsharpe

答えて

0

これはあなたが探しているものであるかどうかは知りませんが、それはinspect.getargspec()を使用する方法の例です:

import inspect 

def _call_fn(fn, *args, **kwargs): 
    argspec = inspect.getargspec(fn) 
    _args = [] 
    _kw = {} 
    _argspec_args = argspec.args[:] 

    if args: 
     # pass positional parameters given to us through 
     _args += list(args) 
     # skip the parameters we've matched 
     _argspec_args = _argspec_args[len(args):] 

    for argname in _argspec_args: 
     if argname in kwargs: 
      _args.append(kwargs.pop(argname)) 
     else: 
      raise TypeError("%s expected parameter %s" % (fn.__name__, argname)) 

    if argspec.keywords is not None and kwargs: 
     _kw.update(kwargs) 

    # print _args, _kw 
    return fn(*_args, **_kw) 


def f(a, b, c, d): 
    print a, b, c, d 

あなたはTypeError

_call_fn(f, 1, 2, d=2, c=3, b=4, q=42) 
を発生させることなく、余分な引数を提供できるように、それは、必要な引数に与えられた引数と一致します10

の位置argsが優先されるので、上記は最初の2つの引数からの3からc=32からd=2まで1 2 3 21 2)を印刷します。 b=4およびq=42は破棄されます)。

関連する問題