【发布时间】:2019-11-08 14:30:23
【问题描述】:
我正在使用来自外部库的函数(例如 scipy.optimize.minimize),为了方便起见,我将它们包装起来以对参数进行预处理和后处理。我知道 functools 中的 wraps 装饰器,但我找不到正确使用它的方法。
这是我所做的基本示例:
def wrapper(outer_arg, **inner_arguments):
inner_arg = prepare_inputs(outer_arg)
inner_output = inner_function(inner_arg, **inner_arguments)
outer_output = prepare_outputs(inner_output)
return outer_output
问题在于我在调用 help 时从 inner_function 中丢失了文档字符串,并且我不想复制包装声明中的所有参数。 我试图像这样添加 wraps 装饰器:
@wraps(inner_function)
def wrapper(outer_arg, **inner_arguments):
inner_arg = prepare_inputs(outer_arg)
inner_output = inner_function(inner_arg, **inner_arguments)
outer_output = prepare_outputs(inner_output)
return outer_output
然后我在调用 help 时丢失了 wrapper 的文档字符串。
有没有办法编写这个函数,让用户了解 wrapper 和 inner_function(并且能够使用自动补全等) ..) ?
【问题讨论】:
-
你不能一边吃蛋糕一边吃。
wrapper有自己的文档字符串,或者它模仿inner_function。您可以将两个文档字符串合并为一个,但不能让一个函数有两个文档字符串。 -
@deceze 我想我太贪心了。您将如何合并两个文档?谢谢
-
类似于
wrapper.__doc__ += '\n' + inner_function.__doc__。 -
这实际上是我的问题的一个很好的答案
-
我目前无法完全测试这一点,所以……当你动摇这个想法时,请随时发布答案。
标签: python wrapper args keyword-argument functools