0

(实在想不出更好的标题了!)

我有一组功能:

def foo(bar, baz)
def spam(blah, etc, woof)

和一个命名空间对象,其中包括函数名称和特定于函数的参数,例如args=(fun=foo, baz=111, baz=222). 如何调用该函数并将参数传递给它?像这样,但更好:

 x = vars(args)
 fun = x['fun']
 del x['fun']
 fun(**x)

(我正在寻找一个不错的单线解决方案)。

4

4 回答 4

2

什么时候aDict是带有函数名称的字典,"fun"您可以尝试以下键和其他参数:

aDict.pop("fun")(**aDict)

于 2012-05-03T09:02:08.660 回答
1

你想要x['fun'](**x)吗?

只要您的函数带有**kwargs参数,这将起作用。如果没有,您将不得不做一些事情来将您想要的条目从命名空间中分割出​​来。

于 2012-05-03T09:15:40.427 回答
0

我不确定您要的是什么,但这应该会给您类似的结果:

def callback(fun, *args, **kwargs):
    return fun(*args, **kwargs)

然后你可以这样称呼它:

callback(some_func, 'a', 'b', c=10, d=123)

这将反过来调用:

some_func('a', 'b', c=10, d=123)
于 2012-05-03T08:58:07.577 回答
0

我不会为您提供解决方案,但这里有一个提示:

>>> import inspect
>>> def g(a, b, c=3):
pass

>>> inspect.getargs(g.func_code)
Arguments(args=['a', 'b', 'c'], varargs=None, keywords=None)

所以现在你知道了参数和它们的顺序,你可以有效地使用 Namespace 对象。注意:这可能只能在 C-Python 中实现!

调用函数使用这个:

>>> arguments = (1, 2, 3)
>>> keywords = {}
>>> g(*arguments, **keywords)

祝你今天过得愉快!

于 2012-05-03T09:07:47.027 回答