autodoc による Python のドキュメント作成¶
Guidedog はソースコードを読んで Python のドキュメントを生成します。パッケージはインポートしません。docstring とシグネチャはドキュメントグラフに組み込まれます。実行時にしか作られないオブジェクトは、明示的に記述する必要があります。これは意図的な境界です。
設定¶
拡張機能を指定し、ソースディレクトリを基準にパッケージの場所を Guidedog に伝えます。Python の sys.path に相当します。
extensions = ["sphinx.ext.autodoc"]
autodoc_source_paths = ["../src"]
guidedog migrate は、sys.path.insert(0, os.path.abspath('..')) など、conf.py がパッケージを探すために使う行から autodoc_source_paths を生成します。別の場所にインストールされたパッケージは、そのディレクトリを追加した場合にだけ見つかります。依存パッケージのソースを取得したディレクトリなどを指定してください。Guidedog は Python 自身の site-packages を検索しません。
各ディレクティブは Sphinx と同じように使えます。
.. automodule:: shop.cart
:members:
:show-inheritance:
.. autoclass:: shop.Cart
:members: add, remove
:inherited-members:
Sphinx 9.1 の全オプションを同じ意味で受け付けます。:members:、:undoc-members:、:private-members:、:special-members:、:inherited-members:、:exclude-members:、:member-order:、:show-inheritance:、:imported-members:、:ignore-module-all:、:class-doc-from:、:no-value:、:annotation:、:no-index:、:no-index-entry:、:synopsis:、:platform:、:deprecated: と、autodoc_default_options を取り消す no- 形式です。
設定項目¶
これらの conf.toml 設定は、Sphinx と同じ名前、値、既定値を使います。
autodoc_source_paths-
Guidedog 独自の設定です。Python モジュールを探すディレクトリを、ソースディレクトリからの相対パスで検索順に指定します。指定したディレクトリ内のファイルだけを読み、外部に通じるシンボリックリンクは拒否します。
autoclass_content-
クラスの説明に使う docstring を指定します。
"class"(既定)、"init"、"both"から選びます。 autodoc_class_signature-
"mixed"(既定)または"separated"。後者では__init__をメソッドとして記載します。 autodoc_default_options-
すべてのディレクティブに適用するオプションの表です。例は
members = trueやmember-order = "bysource"。値をfalseにすると、そのオプションを省きます。 autodoc_docstring_signature-
true(既定):docstring の先頭行がname(args) -> resultのような形なら、シグネチャとして使います。 autodoc_inherit_docstrings-
true(既定):docstring のないメンバーは基底クラスのものを引き継ぎます。 autodoc_member_order-
"alphabetical"(既定)、"groupwise"、"bysource"から選びます。 autodoc_preserve_defaults-
false(既定):既定値をrepr()の表現で表示します。trueではソースに書かれた形を使います。 autodoc_typehints-
"signature"(既定)、"description"(:type:と:rtype:フィールド)、"both"、"none"から選びます。 autodoc_typehints_description_target-
"all"(既定)、"documented"、"documented_params"から選びます。 autodoc_typehints_format-
"short"(既定)または"fully-qualified"。 autodoc_use_type_comments-
true(既定):# type:コメントを型注釈として扱います。 strip_signature_backslash-
Sphinx と同様に、シグネチャ内のバックスラッシュを二重にします。
autodoc_mock_imports,autodoc_type_aliases,autodoc_warningiserror-
設定は受け付けます。インポートしないためモックは不要です。型エイリアスは適用しません。
Guidedog が Python の動作を判断する仕組み¶
名前は Python の束縛規則に従って解決します。パッケージの __init__.py にある from .app import Flask により、flask.Flask は flask/app.py のクラスを指します。autodoc は :canonical: flask.app.Flask を表示します。基底クラスも同様に解決し、Python と同じ規則でメソッド解決順序を計算します。継承したメンバーは基底クラスのソースから取得します。if TYPE_CHECKING: の中だけでインポートした名前は実行時には存在しないため、それを使う注釈は Sphinx と同じく原文のままです。
docstring は Python が保存する文字列です。エスケープを処理し、Python 3.13 のコンパイラと同じ規則でインデントを取り除きます。属性の説明は Sphinx の解析器と同じ場所から読みます。代入の行末または直前の #: コメントと、代入直後の文字列リテラルです。シグネチャは def から取得します。クラスでは Python の検索順に従い、メタクラスの __call__、__new__、__init__ を調べます。dataclass と NamedTuple ではフィールドを使います。@overload の各定義は実装のシグネチャに優先します。
Python を実行しないと分からないこと¶
ソースだけでは Python の動作を判断できない場合、Guidedog は対象の名前を示して報告します。文書化できなければ警告を出します。Sphinx より情報が少ない状態で文書化した場合は、-v で表示する注記を出します。
- コンパイル済みのモジュール(
.so、.pyd)には読めるソースがないため、オブジェクトを見つけられません。 - コードの実行で得る値(
app = Flask(__name__)、now = datetime.now())には:value:を付けません。計算が必要な既定値はソースの表記を使います。 - ソース検索パスの外にあるデコレータ(
@click.command())が生成する関数は、装飾前の関数として文書化します。 - ソース検索パスの外にあるパッケージのクラスは、インポート元のパスで名前を表示します。そのパスは定義元のモジュールと異なる場合があります。メンバー、コンストラクタのシグネチャ、継承される docstring は分かりません。
- 組み込み型の docstring は分かりません。そのため、独自の docstring がなく
dictから継承するはずのメソッドは省きます。 - autodoc のイベント(
autodoc-process-docstring、autodoc-skip-memberなど)を処理する Python 拡張は実行しません。 - 現実のコードを大きく超える深い入れ子は解析せず、
autodoc.too_deepを警告します。Python 自体も 200 段の括弧の入れ子を拒否します。Guidedog は数百のオペランドを含む+の連鎖も拒否します。 - 増大し得る処理には上限があります。インポートと別名をたどる名前解決は、1 経路で 48 ステップ、全体で 100,000 ステップまでです。型エイリアスと定数の展開は 10,000 ステップまでで、それを超えると原文を表示します。クラスの MRO は 100 クラスまでたどります。1 つのディレクティブが生成できる数は 10,000 個までで、超過時は
autodoc.limitを警告します。この上限に達するのは、自分の名前で自分自身を含むクラスです。
不足するパッケージのソースディレクトリを autodoc_source_paths に追加すれば、これらの制約の多くを解消できます。
再ビルド¶
autodoc が読んだ Python ファイルはすべて、そのページの依存関係になります。編集すると次のビルドでページを読み直します。オブジェクトが見つからなかったページは毎回読み直すため、ソースに追加されれば次のビルドで検出します。
安全性¶
文書のビルドでプロジェクトのコードを実行することはありません。Guidedog は Python ソースをテキストとして読み、include と同じ範囲制限を適用します。autodoc_source_paths の下だけを読み、外部に通じるリンクはたどりません。