繁体   English   中英

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

[英]How can I pass keyword arguments as parameters to a function?

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

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请。

看起来你正在寻找***符号:

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 。

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

不完全确定我有你的漂移,但你可能会发现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是一个方便的函数/装饰器,可以调整装饰函数的许多特殊属性,使其看起来像包装函数。 特别是它复制了名称,签名,doc字符串以及包装函数__dict__

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM