让sphinx替换docstring文本

时间:2012-07-28 02:00:50

标签: python python-sphinx

我在Sphinx中记录类似于此的代码:

class ParentClass(object):

    def __init__(self):
        pass

    def generic_fun(self):
        """Call this function using /run/ParentClass/generic_fun()"""
        do_stuff()

class ChildClass(ParentClass):

    def specific_fun(self):
        """Call this function using /run/ChildClass/specific_fun()"""
        do_other_stuff()

我将:inherited-members添加到ChildClass文档中,因此我在其中有语句,如“使用/ run / ParentClass / generic_fun()调用此函数”。

有没有办法可以在文档字符串中添加某些内容,例如sphinx将替换为它正在记录的实际类?

我想让代码看起来像     class ParentClass(object):

    def __init__(self):
        pass

    def generic_fun(self):
        """Call this function using /run/<class_name>/generic_fun()"""
        do_stuff()

所以在ChildClass部分,Sphinx文档将读取...使用/ run / ChildClass / generic_fun()...并且ParentClass部分将读取...使用/ run / ParentClass / generic_fun()... ?

理想情况下,我希望将文档放在同一页面上,因此不同部分的替换字符串会有所不同。

1 个答案:

答案 0 :(得分:7)

在找到别的东西时,我想出了一种方法。

在打印消息之前,autodoc会调用一些函数。我将此代码添加到conf.py文件中:

def get_class_name(full_module_name):
    """
    Pull out the class name from the full_module_name
    """
    #split the full_module_name by "."'s
    return full_module_name.split('.')[-1]

def process_docstring(app, what, name, obj, options, lines):
    classname = get_class_name(name)

    # loop through each line in the docstring and replace |class| with
    # the classname
    for i in xrange(len(lines)):
        lines[i] = lines[i].replace('|class|', classname)

def setup(app):
    app.connect('autodoc-process-docstring', process_docstring)

我想使用|令牌,但它们保留用于全局替换。我通过将以下行放在我的第一个文件(所以代码替换| class | for | class |)来解决这个问题:

.. |class| replace:: `|class|`