如果我必须包装现有方法,让我们从新方法说 wrapee(),比如 wrapper(),并且 wrapee() 为某些参数提供默认值,我如何在不引入不必要的依赖项的情况下保留其语义和维护?让我们说,目标是能够使用 wrapper() 代替 wrapee() 而无需更改客户端代码。例如,如果 wrapee() 定义为:
def wrapee(param1, param2="Some Value"):
# Do something
然后,定义 wrapper() 的一种方法是:
def wrapper(param1, param2="Some Value"):
# Do something
wrapee(param1, param2)
# Do something else.
但是,wrapper() 必须对我不喜欢的 param2 的默认值做出假设。如果我可以控制 wrapee(),我会这样定义它:
def wrapee(param1, param2=None):
param2 = param2 or "Some Value"
# Do something
然后,wrapper() 将更改为:
def wrapper(param1, param2=None):
# Do something
wrapee(param1, param2)
# Do something else.
如果我无法控制 wrapee() 的定义方式,那么如何最好地定义 wrapper()?想到的一个选择是使用非 None 参数创建一个字典并将其作为字典参数传递,但这似乎不必要地乏味。
更新:
解决方案是像这样同时使用列表和字典参数:
def wrapper(param1, *args, **argv):
# Do something
wrapee(param1, *args, **argv)
# Do something else.
以下所有调用都是有效的:
wrapper('test1')
wrapper('test1', 'test2')
wrapper('test1', param2='test2')
wrapper(param2='test2', param1='test1')
最佳答案
查看 argument lists在 Python 文档中。
>>> def wrapper(param1, *stuff, **kargs):
... print(param1)
... print(stuff)
... print(args)
...
>>> wrapper(3, 4, 5, foo=2)
3
(4, 5)
{'foo': 2}
然后传递参数:
wrapee(param1, *stuff, **kargs)
*stuff
是可变数量的非命名参数,**kargs
是可变数量的命名参数。
关于python - 在方法链接时保留参数默认值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2114510/