我有这样的数据:
args, kwargs = (('foo', 'bar', 'baz'), {'goo': 1})
我在对象内部有函数,它们希望这些数据作为参数。它们将通过具有这种签名的方法提供(表示为*args
):
callFunctions((*args, **kwargs), ...)
或者,在其结构中更明确:
callFunctions(((args ...), {kwargs ...}), ...)
(我希望我对这种方法的期望足够清楚。)
假设,为了举例,我的两个函数如下:
def func1(foo, bar):
print foo, bar
def func2(baz, goo=0):
print baz, goo
funcs = func1, func2 # for iteration
在这样的背景下,这是我遇到的两个问题。
为每个函数获取*args
,的格式**kwargs
我一直在尝试使用该inspect
模块来获取每个函数的参数规范,以便我可以用 和 中的一维数据“填充”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
?