4

我有一个带有许多参数和详细帮助消息的函数,例如:

def worker_function(arg1, arg2, arg3):
    """ desired help message:
    arg1 - blah
    arg2 - foo
    arg3 - bar
    """
    print arg1, arg2, arg3

我还有一个包装函数,它会做一些计算,然后调用我的worker_function,将所有参数按原样传递给

def wrapper_function(**args):
    """ this function calls worker_function """
    ### do something here ...
    worker_function(**args)

我希望包装函数的帮助消息(由 python 内置的 help() 函数显示)具有来自工作函数的参数列表帮助消息。

我能得到的最接近的解决方案是:

wrapper_function.__doc__ += "\n\n" + worker_function.__doc__

这导致:

>>? help(wrapper_function)
Help on function wrapper_function in module __main__:

wrapper_function(**args)
    this function calls worker function

    desired help message:
       arg1 - blah
       arg2 - foo
       arg3 - bar

但是这个描述缺少必要的部分——参数列表,即:

worker_function(arg1, arg2, arg3)

(在现实生活中的函数中,参数列表很长,带有默认值,我希望自动显示)。

有没有办法将参数列表或 worker_function 添加到 wrapper_function 的帮助消息中?

4

2 回答 2

6

help()使用模块在内部查找函数数据inspect。除非您默认覆盖函数元数据(如果可能的话),我认为您无法摆脱包装函数的定义。

但是,您可以做的是用来自包装函数的信息填充包装函数的帮助文本。您可以inspect自己使用模块(尤其是getfullargspec方法),也可以只使用pydoc模块(这是help内部使用的)为您生成它。

import pydoc
def wrappedHelpText (wrappedFunc):
    def decorator (f):
         f.__doc__ = 'This method wraps the following method:\n\n' + pydoc.text.document(wrappedFunc)
         return f
    return decorator

@wrappedHelpText(worker_function)
def wrapper_function(**args):
    worker_function(**args)

然后调用help它会生成一个更有用的输出,包括原始签名。

>>> help(wrapper_function)
Help on function wrapper_function in module __main__:

wrapper_function(**args)
    This method wraps the following method:

    worker_function(arg1, arg2, arg3)
        desired help message:
        arg1 - blah
        arg2 - foo
        arg3 - bar
于 2013-11-13T20:16:31.777 回答
2

To preserve argspec you can use decorator module. Or mimic its implementation.

于 2013-11-13T20:00:41.913 回答