假设我有一个函数foo,它可以获得一些参数
def foo(width,height,depth=0): ...
我想编写一个包装器函数来获取所有foo的参数并将它们传递给它,例如
def goo(width,depth=0): ... foo(width,depth) ...
但这很难看,因为我必须重复变量和默认值.
在python中执行此操作的惯用方法是什么?
我想到的几个选项:
>传递给一个名为foo_params的字典并调用foo(** foo_params)然后因为我不知道而容易出错
如果所有的论点都在那里
>为foo编写另一个包装器,检查具有默认值的参数是否为None,如果是,则不传递它们
>将默认值作为常量,这样我就不再重复了
解决方法
您可以使用* args和** kwargs语法来传递未知数量的参数和/或关键字参数:
>>> def dec(func): def inner(*args,**kwargs): print('decorated function') func(*args,**kwargs) return inner >>> @dec def func(a,b): return a + b >>> func(1,2) decorated function >>>
使用* args和** kwargs的一个缺点是你将失去装饰函数的原始函数签名.例如:
>>> help(func) Help on function inner in module __main__: inner(*args,**kwargs) >>>
解决方案是使用functools.wraps()
.它基本上将装饰函数的数据复制到包装函数:
>>> from functools import wraps >>> >>> def dec(func): @wraps(func) def inner(*args,2) decorated function >>>
你可以在下面看到,如果你现在做帮助(func),将显示func的原始签名:
>>> help(func) Help on function func in module __main__: func(a,b) >>>