假设我有一个定义的函数:
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请。
答案 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
将在args
或kwds
中结束,具体取决于它的传递方式,手动解析星形args可能会很乏味。此处inspect.Signature
类,特别是其.bind
和.bind_partial
方法非常有用。
functools.wraps
是一个便利函数/装饰器,可以调整装饰函数的许多特殊属性,使其看起来像包装函数。特别是它复制了名称,签名,文档字符串以及包装函数__dict__
中的任何内容。
这使包装函数更加用户友好。