Python Sphinx Autosummary: Automated listing of member functions

后端 未结 3 1037
忘了有多久
忘了有多久 2020-12-09 17:46

How can I tell the autosummary extension not to only list a single class but also all the class\' members?

If I use:

.. autosummary::

    MyClass


        
相关标签:
3条回答
  • 2020-12-09 18:10

    You can extend the Autosummary directive like below and call it like this:

    .. 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:
    

    Code (in 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)
    
    0 讨论(0)
  • 2020-12-09 18:15

    You have to type out the class members as well

    .. autosummary::
    
        MyClass
        MyClass.doA
        MyClass.doB
    

    I like to split it up with titles or rubrics like

    .. rubric:: Classes
    
    .. autosummary::
    
        MyClass
    
    
    .. rubric:: MyClass Members
    
    .. autosummary::
    
        MyClass.doA
        MyClass.doB
    
    0 讨论(0)
  • 2020-12-09 18:24

    Maybe you should use autoclass provided by sphinx, You can approach that by replacing autosummary:

    .. autoclass:: MyClass
       :members:
    
    0 讨论(0)
提交回复
热议问题