首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从python中的**kwargs函数中获取带有*args的函数

从python中的**kwargs函数中获取带有*args的函数
EN

Stack Overflow用户
提问于 2017-03-04 21:57:06
回答 2查看 326关注 0票数 2

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

Input:一个像f(**kwargs)这样的函数,它带有一个带关键字字典的对的元组。

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

到目前为止我所拥有的是:

代码语言:javascript
复制
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

它能做我想做的事:

代码语言:javascript
复制
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函数。实现这一目标的其他方法有哪些?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2017-03-04 22:43:27

这里有一个解决方案,它也构造了正确的签名。它需要一个合理的最新Python,因为它使用了对inspect模块和__signature__特殊属性的相对最近的添加。

代码语言:javascript
复制
import inspect

def build_sig(arg_tuple):
    return inspect.Signature(parameters = [inspect.Parameter(
        name=name, kind=inspect.Parameter.POSITIONAL_OR_KEYWORD, 
        default=default) for name, default in arg_tuple])

def wrap(f, arg_tuple):
    sig = build_sig(arg_tuple)
    def g(*args, **kwds):
        bound = sig.bind(*args, **kwds)
        bound.apply_defaults()
        return f(**bound.arguments)
    g.__signature__ = sig
    return g

def f(*args, **kwds):
    return(args, kwds)

g = wrap(f, (['a', 1], ['b', 7]))

print(inspect.getargspec(g))
print(g(3))

# ArgSpec(args=['a', 'b'], varargs=None, keywords=None, defaults=(1, 7))
# ((), {'a': 3, 'b': 7})
票数 2
EN

Stack Overflow用户

发布于 2017-03-04 22:08:16

你要找的是functools.partial()

代码语言:javascript
复制
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)
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/42601882

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档