(实在想不出更好的标题了!)
我有一组功能:
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)
(我正在寻找一个不错的单线解决方案)。
什么时候aDict
是带有函数名称的字典,"fun"
您可以尝试以下键和其他参数:
aDict.pop("fun")(**aDict)
你想要x['fun'](**x)
吗?
只要您的函数带有**kwargs
参数,这将起作用。如果没有,您将不得不做一些事情来将您想要的条目从命名空间中分割出来。
我不确定您要的是什么,但这应该会给您类似的结果:
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)
我不会为您提供解决方案,但这里有一个提示:
>>> 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)
祝你今天过得愉快!