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

时间:2017-03-13 11:49:45

标签: python python-sphinx python-decorators

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:

1 个答案:

答案 0 :(得分:0)

这是documented in sphinx manual

  

请注意

     

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