[英]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
将以args
或kwds
结束,具体取决于它的传递方式,手动解析星形args可能会很乏味。 这里的inspect.Signature
类,特别是它的.bind
和.bind_partial
方法很有用。
functools.wraps
是一个方便的函数/装饰器,可以调整装饰函数的许多特殊属性,使其看起来像包装函数。 特别是它复制了名称,签名,doc字符串以及包装函数__dict__
。
这使包装函数更加用户友好。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.