为什么我无法使用 sphinx python 包打印文档字符串?

Why am I unable to get docstring printed out using sphinx python package?

我正在使用 Sphinx 来记录我的函数。但是,它不会使用装饰器读取我的文档字符串。 Sphinx 只是将函数文档字符串替换为 <The magic happens here>

我的函数是用装饰器以这种方式编写的。如何让 Sphinx 检测函数中的文档字符串。

文件夹是这种格式

def wrap(pre, post):
    """ Wrapper """

    def decorate(func):
        """ Decorator """

        def call(*args, **kwargs):
            """ The magic happens here """
            pre(func)
            result = func(*args, **kwargs)
            post(func)
            return result
        return call
    return decorate

def entering(func, *args):
    """ Pre function logging """
    logging.debug("Entered {}".format(func.__name__))
    # logging.info(func.__doc__)
    logging.debug("Function at line {} in {}".format(func.__code__.co_firstlineno, func.__code__.co_filename))
    try:
        logging.debug("The argument {} is {}".format(func.__code__.co_varnames[0], *args))
    except IndexError:
        logging.debug("No arguments")


def exiting(func):
    """ Post function logging """
    logging.debug("Exited {}".format(func.__name__))

@wrap(entering, exiting)
def function(a, b):
    """
    Function to execute
    :param a:
    :param b:
    :return: Sum of a+b
    """
    return a+b

您需要 decorate 函数在返回之前将文档字符串从 func 复制到 call。否则Sphinx只能得到call的docstring,不能得到原函数的docstring。

你可以自己直接做 call.__doc__ = func.__doc__,或者你可以使用标准库中的 functools.wraps 装饰器为你做(默认情况下它也会复制一些其他属性,并且可以定制很多)。

我会尝试:

import functools

def wrap(pre, post):
    """ Wrapper """

    def decorate(func):
        """ Decorator """

        @functools.wraps(func)              # this copies over the docstring and more
        def call(*args, **kwargs):
            """ The magic happens here """
            pre(func)
            result = func(*args, **kwargs)
            post(func)
            return result
        return call
    return decorate