2013-12-13 10 views
9

どのようにして、1つのクラスだけでなく、すべてのクラスのメンバーをリストアップするようにautosummary拡張機能に指示できますか?Python Sphinx Autosummary:メンバー関数の自動リスト

私が使用している場合:行うには

のMyClass(VAR1、VAR2、....)私のカスタムクラス:

結果のHTMLファイル内
.. autosummary:: 

    MyClass 

、だけのようなもの短い要約があるだろう派手なもの...

私が実際にしたいことのようなものです:派手なことを行うために

のMyClass(VAR1、VAR2、....)私のカスタムクラス...

MyClass.doA(VAR1、VAR2、...)非常によく

MyClass.doB(VAR1、VAR2は、...)私は設定する必要がありますどのようにBより良い

行いませんautosummaryディレクティブを使って、これを得ることができます(autosummaryディレクティブですべての関数を退屈に指定することは別です)。 ありがとう!

答えて

14

あなたはAutosumma以下とこのようにそれを呼び出すようRYディレクティブ:

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

コード:

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

これはすばらしいです!ページからtoctreeにメソッドと属性を取得する方法はありますか?それはautosummary:toctree:オプションがこれを破るようだ? –

+0

ありがとう! toctreeオプションを適用しようとしたことはありませんでしたが、あなたが知っている限り、 '' toctree ':directives.unchanged'をインクルードするためにoption_spec辞書を拡張する必要があります。 – clonker

+1

非常に便利ですが、スフィンクスの拡張機能を書いていない人には、このコードをどこに置く必要がありますか?そして、 'app'変数はどこから来ていますか? (そして、はい、私はチュートリアルを見てきましたが、それは私にも教えてくれません) – Raik

0

たぶん、あなたはスフィンクスが提供するautoclassを使用する必要があり、あなたは自動サマリー置き換えることによって、それに近づくことができます。

.. autoclass:: MyClass 
    :members: 
+4

[OK]を、それを明確にするために、私はすでにAUTOCLASS機能を使用します。私が欲しいのは、htmlページの始めに自動文書化された概要テーブルです。すべてのクラス関数を一度に直接見ることができるように、また、以下の詳細を参照してください。 – SmCaterpillar

+2

autosummaryのソースコードを確認した後、これを今完了することは不可能に思えます。 https://bitbucket.org/birkenfeld/sphinx/src/c411c343dd216f41d263b5f5a14ad14d3ff5dad7/sphinx/ext/autosummary/__init__.py?at=default#cl-198 – iMom0

2

をあなたが同様に

.. autosummary:: 

    MyClass 
    MyClass.doA 
    MyClass.doB 

をクラスメンバーを入力する必要が、私はそれを分割したいですタイトルやルービックのようなもの

.. rubric:: Classes 

.. autosummary:: 

    MyClass 


.. rubric:: MyClass Members 

.. autosummary:: 

    MyClass.doA 
    MyClass.doB 
関連する問題