python - 在方法链接时保留参数默认值

标签 python

如果我必须包装现有方法,让我们从新方法说 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/

相关文章:

python - tkinter sticky=N+W 错误 : global name 'N' is not defined

python - 嵌入Python 3.3

python - 如何连接字典中文本的连续单词?

python - 无法访问同一类中的另一个函数 (Python)

python - 将元素添加到链表的末尾

python - QListWidgetItem 保存列表之间的数据

python - Python 中的区域设置日期格式

Python gettext i18n 具有相同语言的不同版本

python - 在 Google App Engine 上设计可扩展的产品数据库

python - 使用 Tensorflow 策略梯度训练乒乓球游戏代理的问题