Sphinxのautodocを使用してクラスの__init __(self)メソッドをドキュメント化する方法は?


107

Sphinxはデフォルトでは__init __(self)のドキュメントを生成しません。私は以下を試しました:

.. automodule:: mymodule
    :members:

そして

..autoclass:: MyClass
    :members:

conf.pyで、次の設定は__init __(self)docstringをクラスdocstringに追加するだけです(Sphinx autodocドキュメントはこれが予想される動作であることに同意しているようですが、私が解決しようとしている問題については何も言及していません)。

autoclass_content = 'both'

いいえ、それは少なくとも今日のドキュメントが書いていることではありません:"both" Both the class’ and the __init__ method’s docstring are concatenated and inserted.->したがって、それだけでなく、__init__(self)もしあれば、クラスdocstringであるべきです。テストケースを提供できますか?そうであれば、バグのように感じますよね?
lpapp

回答:


116

ここに3つの選択肢があります:

  1. __init__()常に文書化されるようにするにはautodoc-skip-member、conf.pyで使用できます。このような:

    def skip(app, what, name, obj, would_skip, options):
        if name == "__init__":
            return False
        return would_skip
    
    def setup(app):
        app.connect("autodoc-skip-member", skip)

    これ__init__は、スキップしないことを明示的に定義します(デフォルトではスキップされます)。この構成は一度指定され、.rstソースのすべてのクラスに追加のマークアップを必要としません。

  2. このspecial-membersオプションはSphinx 1.1で追加されました。「特別な」メンバー(などの名前のメンバー__special__)がautodocによって文書化されます。

    Sphinx 1.2以降、このオプションは引数を取るため、以前よりも便利です。

  3. 使用automethod

    .. autoclass:: MyClass     
       :members: 
    
       .. automethod:: __init__

    これは、すべてのクラスに追加する必要があります(automoduleこの回答の最初のリビジョンへのコメントで指摘されているように、では使用できません)。


7
automoduleはすべてのクラスに追加する必要があるため、これは役に立ちません。
ロジャービン

3
最初の代替案が機能しました。私の場合、.rstファイルを編集する必要がないので、2番目と3番目の選択肢よりも優れていました。
jcarballo 2013

9
Sphinx 1.2.1では、special-membersを使用して正常に動作しautomoduleます。:special-members: __init__文書化にのみ使用します__init__
Florian Brucker 14

67

あなたは近くにいた。ファイルでautoclass_contentオプションを使用できconf.pyます。

autoclass_content = 'both'

1
@MichaelMrozek:私もそれについて不思議に思っています...この回答の高い賛成率を理解しましたか?最初は、削除する必要がある回答のように見えます。
lpapp

1
autoclass_content = 'both'オプションの設定を試みましたが、initメソッドがドキュメント化されていましたが、自動集計が2回表示されました。
2015

これは受け入れられる答えになるはずです。よりシンプルで、公式のスフィンクスのドキュメントを参照しています。
BerriJ

6

過去数年にわたり、私はいくつかのバリエーション書いてきたautodoc-skip-member私のような方法を望んでいたので、様々な関連のないPythonのプロジェクトのためのコールバックを__init__()__enter__()そして__exit__()私のAPIドキュメントに表示する(すべての後に、これらの「特別な方法は、」APIの一部と何に場所優れています特別なメソッドのdocstring内よりもそれらを文書化します)。

最近、私は最良の実装を採用し、それを私のPythonプロジェクトの一部にしました(ここにドキュメントがあります)。実装は基本的にこれに帰着します:

import types

def setup(app):
    """Enable Sphinx customizations."""
    enable_special_methods(app)


def enable_special_methods(app):
    """
    Enable documenting "special methods" using the autodoc_ extension.

    :param app: The Sphinx application object.

    This function connects the :func:`special_methods_callback()` function to
    ``autodoc-skip-member`` events.

    .. _autodoc: http://www.sphinx-doc.org/en/stable/ext/autodoc.html
    """
    app.connect('autodoc-skip-member', special_methods_callback)


def special_methods_callback(app, what, name, obj, skip, options):
    """
    Enable documenting "special methods" using the autodoc_ extension.

    Refer to :func:`enable_special_methods()` to enable the use of this
    function (you probably don't want to call
    :func:`special_methods_callback()` directly).

    This function implements a callback for ``autodoc-skip-member`` events to
    include documented "special methods" (method names with two leading and two
    trailing underscores) in your documentation. The result is similar to the
    use of the ``special-members`` flag with one big difference: Special
    methods are included but other types of members are ignored. This means
    that attributes like ``__weakref__`` will always be ignored (this was my
    main annoyance with the ``special-members`` flag).

    The parameters expected by this function are those defined for Sphinx event
    callback functions (i.e. I'm not going to document them here :-).
    """
    if getattr(obj, '__doc__', None) and isinstance(obj, (types.FunctionType, types.MethodType)):
        return False
    else:
        return skip

はい、ロジックよりも多くのドキュメントがあります:-)。(私にとって)オプションautodoc-skip-memberの使用に対するこのようなコールバックの定義の利点special-membersは、このspecial-membersオプションによって__weakref__、ノイズを考慮し、まったく役に立たない(すべての新しいスタイルのクラス、AFAIKで利用可能)などのプロパティのドキュメント化も有効になることです。コールバックアプローチはこれを回避します(関数/メソッドでのみ機能し、他の属性を無視するため)。


これはどのように使用しますか?setup(app)Sphinxで実行するには、メソッドに名前を付ける必要があるようです。
oarfish '16

私はそれをすべて理解しているわけではありませんが、自分自身を分析したい場合はxoloxの実装を参照してください。私は、コールバックをautodoc-skip-memberイベントに接続するスフィンクス拡張機能を作成したと思います。sphinxが何かを含める/スキップする必要があるかどうかを判断しようとすると、そのイベントが発生し、彼のコードが実行されます。彼のコードがユーザーによって明示的に定義された特別なメンバーを検出した場合(よくあるように継承されます)、それはSphinxにそれを含めるように指示します。そうすることで、自分で作成した特別なメンバーを文書化できます
Andrew

アンドリューと明確な説明をありがとう、はいあなたは正しいオールフィッシュです、セットアップ機能が必要です。さらに混乱を避けるために、例に追加しました。
xolox

@JoelB:私の投稿のサンプルコードは、__init__メソッドに空でないdocstringがあることを前提としています。そうですか?
xolox

2

これは古い投稿ですが、現時点で調べている人のために、バージョン1.8で導入された別のソリューションもあります。ドキュメントによると、special-memberautodoc_default_options のキーをに追加でき ますconf.py

例:

autodoc_default_options = {
    'members': True,
    'member-order': 'bysource',
    'special-members': '__init__',
    'undoc-members': True,
    'exclude-members': '__weakref__'
}

0

これは、__init__引数がある場合にのみ含まれるバリアントです。

import inspect

def skip_init_without_args(app, what, name, obj, would_skip, options):
    if name == '__init__':
        func = getattr(obj, '__init__')
        spec = inspect.getfullargspec(func)
        return not spec.args and not spec.varargs and not spec.varkw and not spec.kwonlyargs
    return would_skip

def setup(app):
    app.connect("autodoc-skip-member", skip_init_without_args)
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.