2013-12-13 7 views
9

Wie kann ich die Autosummary-Erweiterung nicht nur eine einzelne Klasse auflisten, sondern auch alle Mitglieder der Klasse?Python Sphinx Autosummary: Automatisierte Auflistung der Mitgliedsfunktionen

Wenn ich benutze:

.. autosummary:: 

    MyClass 

In der resultierenden HTML-Datei, wird es nur eine kurze Zusammenfassung wie:

MyClass (var1, var2, ....) My Custom-Klasse zu tun Phantasie Dinge ...

Was ich will, ist eigentlich so etwas wie:

MyClass (var1, var2, ....) Klasse My Custom Phantasie Dinge zu tun ...

MyClass.doA (var1, var2, ...) hat eine sehr gut

MyClass.doB (var1, var2, ...) Ist B noch besser

Wie muss ich das konfigurieren autosummary-Direktive, um dies zu erreichen (abgesehen von der mühsamen Benennung aller Funktionen in der Autosummary-Direktive)? Danke!

Antwort

14

Sie können die Autosumma erweitern ry Direktive wie es wie folgt weiter unten und rufen:

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

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() 

app.add_directive('autoautosummary', AutoAutoSummary) 
+0

Das ist genial! Irgendeine Idee, wie man die Methoden u. Die Attribute von der Seite in den totree holt? Es scheint, dass die autosummary: toctree: Optionen das brechen? –

+0

Danke! Ich habe noch nie versucht, die Option toctree anzuwenden, aber soweit ich weiß, müssen Sie das Wörterbuch option_spec nur um ein '' toctree ': directives.unchanged' erweitern. – clonker

+1

Sieht äußerst nützlich aus, aber für jemanden, der nicht im Geschäft mit Sphinx-Erweiterungen ist, wo muss ich diesen Code ablegen? Und woher kommt die 'app'-Variable? (Und ja, ich habe mir das Tutorial angeschaut und es auch nicht.) – Raik

0

Vielleicht sollten Sie autoclass von Sphinx zur Verfügung gestellt verwenden, können Sie diesen Ansatz durch den Ersatz Autozusammenfassen:

.. autoclass:: MyClass 
    :members: 
+4

Ok, das zu klären, habe ich bereits die Funktionalität nutzen autoclass. Was ich will, ist eine Übersichtstabelle am Anfang der HTML-Seite, auf die die Autodokumentation folgt. Damit sehen Sie alle Klassenfunktionen direkt auf einmal und die Details unten. – SmCaterpillar

+2

Nach Überprüfung des Quellcodes von Autosummary, scheint es unmöglich, dies jetzt zu vervollständigen. https://bitbucket.org/birkenfeld/sphinx/src/c411c343dd216f41d263b5f5a14ad14d3ff5dad7/sphinx/ext/autosummary/__init__.py?at=default#cl-198 – iMom0

2

Sie haben auch die Klassenmitglieder tippen

.. autosummary:: 

    MyClass 
    MyClass.doA 
    MyClass.doB 

Ich mag es spalten mit Titeln oder Rubriken wie

.. rubric:: Classes 

.. autosummary:: 

    MyClass 


.. rubric:: MyClass Members 

.. autosummary:: 

    MyClass.doA 
    MyClass.doB 
Verwandte Themen