如何让 sphinx 识别装饰的 python 函数

Posted

技术标签:

【中文标题】如何让 sphinx 识别装饰的 python 函数【英文标题】:How do I get sphinx to recognize decorated python functions 【发布时间】:2017-08-03 10:16:16 【问题描述】:

Sphinx 不记录用装饰器包装的函数。我曾尝试使用类风格装饰器和函数风格装饰器,但无济于事。这些函数没有出现在我生成的 html 中,而同一模块中的其他函数确实出现了

唯一成功的方法是用装饰器装饰器包装我的类装饰器,但这不会在类中使用__call__ 函数,我需要从装饰器返回一个值

import decorator
import functools

@decorator.decorator
def MyDecoratorA(fn, *args, **kwargs):
    # do things
    return fn(*args, **kwargs)

def MyDecoratorB(fn):

    @functools.wraps(fn)
    def inner(*args, **kwargs):
        # do things
        return fn(*args, **kwargs)
    return inner


@MyDecoratorA
def TestA(a, b=None):
    """This is a doc

    :param a: variable b
    :type a: int
    :param b: variable b
    :type b: list
    :returns: None
    """
    pass

@MyDecoratorB
def TestB(a, b=None):
    """This is a doc

    :param a: variable b
    :type a: int
    :param b: variable b
    :type b: list
    :returns: None
    """
    pass

然后我有一个运行的批处理文件

sphinx-apidoc -f -l -M -T -o /tmp/source/testfunctions $DIR/modules/testfunctions/ 1>/dev/null
make html

这会生成一个名为 testfunctions.rst 的文件,其中包含 testfunctions 文件夹中每个模块的部分

testfunctions.cluster module
----------------------------

.. automodule:: testfunctions.cluster
    :members:
    :undoc-members:
    :show-inheritance:

【问题讨论】:

使用minimal reproducible example,可能会更容易提供帮助。 所有功能都记录在案 只是示例代码 您提到了一个带有__call__ 方法的类。它不在您的示例代码中。 我尝试将装饰器实现为一个类,看看是否有帮助,但没有。你有什么建议吗? 【参考方案1】:

这是documented in sphinx manual:

注意

如果您记录修饰的函数或方法,请记住 autodoc 通过导入模块并检查给定函数或方法的 doc 属性来检索其文档字符串。这意味着如果一个装饰器用另一个装饰器替换了被装饰的函数,它必须将原来的 doc 复制到新的函数中。 从 Python 2.5 开始,functools.wraps() 可用于创建行为良好的装饰函数。

【讨论】:

我已经尝试过了,问题是函数的签名发生了变化,参数列表隐藏在 *args 和 **kwargs 后面,我看不到函数中定义的参数 至少你的装饰函数确实出现了,是吗?-) 不,他们没有出现

以上是关于如何让 sphinx 识别装饰的 python 函数的主要内容,如果未能解决你的问题,请参考以下文章

交叉引用装饰器

如何让 PyC​​harm 识别自定义属性装饰器?

Sphinx autodoc - 装饰器和 ReadTheDocs

python之装饰器

python之装饰器

如何为 sphinx 文档保留装饰类的文档字符串?