python-sphinx扩展,如何获取当前对象的名称?

时间:2018-07-19 12:14:03

标签: python python-sphinx

如何在Python代码中获取为其创建当前文档的父对象的名称?我的意思是如何在MyDirective.run()中获取类“ ExampleCls0”的名称?

class ExampleCls0():
    """
    .. mydirect::

    """

让我们假设我们有一个名为mydirect的Spring指令。

它已在Sphinx中正确注册,并且文档是针对python代码构建的。

class MyDirective(Directive):
    required_arguments = 0
    optional_arguments = 0
    has_content = True
    option_spec = {}

    def run(self):
        env = self.state.document.settings.env

def setup(app):
    app.add_directive('mydirect', MyDirective)

对于构建,我正在使用:

from sphinx.cmdline import main as sphinx_main
from sphinx.ext.apidoc import main as apidoc_main

apidoc_main(["--module-first", "--force", "--full",
             "--output-dir", "doc/", "."])

sphinx_main(["-b", "html", "-E",
      "-c", pwd,
      "doc/",
      "doc_build/",
])

1 个答案:

答案 0 :(得分:0)

我不知道是否可以在Directive.run方法中的某个位置访问父对象的名称,但是我发现以后可以读取该名称。

class SchematicLink(nodes.TextElement):

    @staticmethod
    def depart_html(self, node):
        self.depart_admonition(node)

    @staticmethod
    def visit_html(self, node):
        parentClsNode = node.parent.parent
        assert parentClsNode.attributes['objtype'] == 'class'
        assert parentClsNode.attributes['domain'] == 'py'
        sign = node.parent.parent.children[0]
        assert isinstance(sign, desc_signature)
        absoluteName = sign.attributes['ids'][0]
        print(absoluteName) # file0.ExampleCls0
        self.visit_admonition(node)


class MyDirective(Directive):
    required_arguments = 0
    optional_arguments = 0

    def run(self):
        schema_node = SchematicLink()
        self.state.nested_parse(self.content,
                                self.content_offset,
                                schema_node)
        return [schema_node]

def setup(app):
    app.add_node(SchematicLink,
                 html=(SchematicLink.visit_html,
                       SchematicLink.depart_html))
    app.add_directive('mydirect', MyDirective)

这可能是一个很好的例子,说明如何不这样做。代码从类doc的标签中读取ID。