次のようなデータがあります。
args, kwargs = (('foo', 'bar', 'baz'), {'goo': 1})
そして、オブジェクト内に、これらのデータを引数として必要とする関数があります。これらは、この種の署名を持つメソッドを介して提供されます ( として表されます*args
):
callFunctions((*args, **kwargs), ...)
または、その構造でより明示的に:
callFunctions(((args ...), {kwargs ...}), ...)
(この方法で私が期待していることは十分に明確であることを願っています。)
例として、私の 2 つの関数が次のようになっているとします。
def func1(foo, bar):
print foo, bar
def func2(baz, goo=0):
print baz, goo
funcs = func1, func2 # for iteration
その背景で、ここに私が抱えている2つの問題があります。
関数ごとに の形式を取得*args
する**kwargs
モジュールを使用して各関数の引数仕様を取得しようとしてきたので、とinspect
の 1d データで構造体を「埋める」ことができます。私は次のことを試しました:args
kwargs
format = [(spec.args, spec.keywords) for spec in (inspect.getargspec(func) for func in funcs)]
しかし、なぜ がspec.keywords
常に私に与えるのか理解できませんNone
(一種の愚かなようです)。キーワード引数のデフォルト値は に表示されますがspec.defaults
、それを正しいキーワード引数に関連付ける方法がわかりません。(すべてのキーワード引数が に入れられるのもイライラしますspec.args
。)
[(['foo', 'bar'], None), (['baz', 'goo'], None)]
渡される構造体を埋めるcallFunctions
とにかく構造体があると仮定すると、その構造体を元のデータで埋めるのは難しいです*args, **kwargs
。次に、次の位置引数と適切なキーワード引数を使用して、次のタプルに移動します。等々。私は次のことを試しました:
argues = []
positional_index = 0
format = ((('foo', 'bar'), {}), (('baz',), {'goo': 0}))
for pair in format:
however_many = len(pair[0])
argues.append((tuple(args[positional_index:however_many]), dict({(k, kwargs[k]) for k in pair[1]})))
positional_index += however_many
しかし、私はこれを取得します:
[(('foo', 'bar'), {}), ((), {'goo': 1})]
なぜ私は取得しないのbaz
ですか?