在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
函数。有什么其他方法可以实现这一目标?
答案 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__