如何将关键字参数作为参数传递给函数?

时间:2017-03-10 17:23:08

标签: python python-3.x parameters arguments parameter-passing

假设我有一个定义的函数:

def inner_func(spam, eggs):
    # code

然后我想调用这样的函数:

outer_func(spam=45, eggs="blah")

内部outer_func我希望能够使用与传递到inner_func完全相同的参数来调用outer_func

这可以通过这样写outer_func来实现:

def outer_func(spam, eggs):
    inner_func(spam, eggs)

但是,我希望能够更改参数inner_func,并相应地更改我传递给outer_func的参数,但不必更改outer_func中的任何内容每一次。

有(简单)方法吗? Python 3请。

2 个答案:

答案 0 :(得分:5)

您好像在寻找***符号:

def outer_func(*args, **kwargs):
    inner_func(*args, **kwargs)

然后你可以outer_func(1, 2, 3, a='x', b='y')outer_func会拨打inner_func(1, 2, 3, a='x', b='y')

如果您只想允许关键字参数,请删除*args

在函数定义中,标有*的参数接收所有位置参数的元组,这些参数与其他声明的参数不对应,标有**的参数接收所有关键字的dict与其他声明的参数不对应的参数。

在函数调用中,使用*为序列(或其他可迭代)参数添加前缀将其解包为单独的位置参数,并使用**为映射参数添加前缀,将其解压缩为单独的关键字参数。

答案 1 :(得分:0)

我不完全确定我的漂移,但您可能会发现functools.wraps有趣:

@functools.wraps(inner_func)
def outer_func(*args, **kwds):
    return inner_func(*args, **kwds)

inspect.signature(outer_func)
# <Signature (spam, eggs)>

说明:“star arguments”收集所有未明确指定的postional(* args)和关键字(** kwds)参数。它们也可用于传递这些参数;或操纵它们:args是一个元组,而kwds是一个字典。

因为例如参数spam将在argskwds中结束,具体取决于它的传递方式,手动解析星形args可能会很乏味。此处inspect.Signature类,特别是其.bind.bind_partial方法非常有用。

functools.wraps是一个便利函数/装饰器,可以调整装饰函数的许多特殊属性,使其看起来像包装函数。特别是它复制了名称,签名,文档字符串以及包装函数__dict__中的任何内容。

这使包装函数更加用户友好。