从函数中使用* args获取函数,在python中使用** kwargs

时间:2017-03-04 21:57:07

标签: python function arguments

在Python中,我希望有一个方法可以从旧方法构建一个新函数。

输入:像f(**kwargs)这样的函数以及带关键字词典的对元组

输出:一个新函数,它将元组中的对作为参数和默认值。

到目前为止我所拥有的:

def f(**kwargs):
    return 'test',kwargs['a'], kwargs['b'] 

def magic(f,argtuple):
    arglist=",".join([str(ke)+" = "+str(va) for ke,va in argtuple])
    keylist=",".join([str(ke)+" = "+str(ke) for ke,va in argtuple])
    exec("def g("+arglist+"): return f("+keylist+")")
    return g

它做我想要的:

In [25]: f(b=4,a=3)
Out[25]: ('test', 3, 4)

In [26]: g=magic(f,(['a',1],['b',2]))

In [27]: g()
Out[27]: ('test', 1, 2)

In [28]: g(a=3,b=5)
Out[28]: ('test', 3, 5)

In [29]: import inspect

In [30]: print  inspect.getargspec(f)
ArgSpec(args=[], varargs=None, keywords='kwargs', defaults=None)

In [31]: print  inspect.getargspec(g)
ArgSpec(args=['a', 'b'], varargs=None, keywords=None, defaults=(1, 2))

但是我不想构建字符串而不想使用exec函数。有什么其他方法可以实现这一目标?

2 个答案:

答案 0 :(得分:3)

您要找的是functools.partial()

import functools

def f(**kwargs):
    return 'test',kwargs['a'], kwargs['b']

def magic(f, argtuple):
    return functools.partial(f, **dict(argtuple))

g = magic(f, (['a',1],['b',2]))
print g()  # ('test', 1, 2)

答案 1 :(得分:2)

这是一个也构建正确签名的解决方案。它需要一个合理的最新Python,因为它使用了tag = [] if some_result: tag.append('a_tag') 模块和inspect特殊属性的相对最新添加。

__signature__