【问题标题】:Pythonic way to wrap a function using additional arguments and changing the output使用附加参数包装函数并更改输出的 Pythonic 方法
【发布时间】: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 的文档字符串。

有没有办法编写这个函数,让用户了解 wrapperinner_function(并且能够使用自动补全等) ..) ?

【问题讨论】:

  • 你不能一边吃蛋糕一边吃。 wrapper 有自己的文档字符串,或者它模仿 inner_function。您可以将两个文档字符串合并为一个,但不能让一个函数有两个文档字符串。
  • @deceze 我想我太贪心了。您将如何合并两个文档?谢谢
  • 类似于wrapper.__doc__ += '\n' + inner_function.__doc__
  • 这实际上是我的问题的一个很好的答案
  • 我目前无法完全测试这一点,所以……当你动摇这个想法时,请随时发布答案。

标签: python wrapper args keyword-argument functools


【解决方案1】:

使用@deceze 的想法,我构建了一个装饰器来格式化包装函数的文档字符串:

def merge_docstrings(other):
    def decorator(func):
        func.__doc__ = f'{func.__doc__}'.format(other.__doc__)
        return func
    return decorator

它确实使用inner_function 之一格式化wrapper docstring 但是,例如在 PyCharm 中显示文档字符串时,它就不能很好地工作,而且显然您不会使用 inner_function 的参数自动完成。我不确定自动完成是如何工作的,以及是否有可能实现我想要的。

【讨论】:

  • func 的文档字符串包含一个 {0},我希望 other 的文档字符串具有特征。所以这就是我设法做到的。我对字符串不太擅长,因为这不是最好的方法。 func.__doc__.format(other.__doc__) 会工作吗?
猜你喜欢
  • 2017-09-15
  • 1970-01-01
  • 2018-05-24
  • 2022-11-15
  • 1970-01-01
  • 2011-03-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多