Python Sphinx Autosummary: автоматический список функций-членов

Как я могу указать autosummary extension не только список одного класса, но и всех членов класса?

Если я использую:

.. autosummary::

    MyClass

В результирующем файле html будет только одна короткая сводка вроде:

MyClass (var1, var2,....) Мой пользовательский класс, чтобы делать причудливые вещи...

То, что я действительно хочу, это что-то вроде:

MyClass (var1, var2,....) Мой пользовательский класс, чтобы делать причудливые вещи...

MyClass.doA(var1, var2,...) Очень хорошо

MyClass.doB(var1, var2,...) Улучшает ли B

Как мне настроить конфигурационную директиву, чтобы получить это (кроме утомительного наименования всех функций в директиве autosummary)? Спасибо!

Ответ 1

Вы можете расширить директиву Autosummary, как показано ниже, и называть ее следующим образом:

.. autoclass:: your.fully.qualified.path.to.the.Class
   :members:
   :undoc-members:

    .. rubric:: Methods

    .. autoautosummary:: your.fully.qualified.path.to.the.Class
        :methods:

    .. rubric:: Attributes

    .. autoautosummary:: your.fully.qualified.path.to.the.Class
        :attributes:

Код (в conf.py):

from sphinx.ext.autosummary import Autosummary
from sphinx.ext.autosummary import get_documenter
from docutils.parsers.rst import directives
from sphinx.util.inspect import safe_getattr
import re

class AutoAutoSummary(Autosummary):

    option_spec = {
        'methods': directives.unchanged,
        'attributes': directives.unchanged
    }

    required_arguments = 1

    @staticmethod
    def get_members(obj, typ, include_public=None):
        if not include_public:
            include_public = []
        items = []
        for name in dir(obj):
            try:
                documenter = get_documenter(safe_getattr(obj, name), obj)
            except AttributeError:
                continue
            if documenter.objtype == typ:
                items.append(name)
        public = [x for x in items if x in include_public or not x.startswith('_')]
        return public, items

    def run(self):
        clazz = str(self.arguments[0])
        try:
            (module_name, class_name) = clazz.rsplit('.', 1)
            m = __import__(module_name, globals(), locals(), [class_name])
            c = getattr(m, class_name)
            if 'methods' in self.options:
                _, methods = self.get_members(c, 'method', ['__init__'])

                self.content = ["~%s.%s" % (clazz, method) for method in methods if not method.startswith('_')]
            if 'attributes' in self.options:
                _, attribs = self.get_members(c, 'attribute')
                self.content = ["~%s.%s" % (clazz, attrib) for attrib in attribs if not attrib.startswith('_')]
        finally:
            return super(AutoAutoSummary, self).run()

def setup(app):
    app.add_directive('autoautosummary', AutoAutoSummary)

Ответ 2

Вы также должны ввести члены класса

.. autosummary::

    MyClass
    MyClass.doA
    MyClass.doB

Мне нравится разбивать его на заголовки или рубрики, например

.. rubric:: Classes

.. autosummary::

    MyClass


.. rubric:: MyClass Members

.. autosummary::

    MyClass.doA
    MyClass.doB

Ответ 3

Может быть, вы должны использовать автокласс, предоставленный sphinx, вы можете подойти к этому, заменив autosummary:

.. autoclass:: MyClass
   :members: