工学と解析 / Sphinx チュートリアル
Sphinx で Python ドキュメントを自動生成する
water_potability プロジェクトの実ファイルを使って、コマンド3本で動かす
analysis.py に書いた docstring を読ませるだけで、関数の説明・引数・戻り値・例外が整ったHTMLドキュメントになる。コマンドは3本。理屈は後でわかる。まず動かす。
1Sphinx とは
Sphinx は Python コードの中の docstring(説明文字列) を読み取って、HTML のドキュメントサイトを自動で組み立てるツールだ。
water_potability/analysis.py には load_data()・evaluate_model() など11個の関数が書かれており、それぞれ :param: や :return: 付きの docstring がある。Sphinx はこれを読んで、引数テーブル・戻り値・例外一覧を含むHTMLページを自動生成する。自分でHTMLを一行も書く必要はない。
関数・クラス・モジュールの直後に書く三連引用符の文字列。analysis.py の load_data() 冒頭にある """ローカル CSV を読み込んで…""" がこれにあたる。Sphinx はこの文字列をドキュメントの原料にする。
2water_potability プロジェクトの構成
添付のファイル構造を整理すると、Sphinx に関係する部分は次のとおりだ。
.venv/ ← Sphinx 本体・コマンドはここ(触らない)
water_potability/ ← ドキュメントの「原料」(docstring を書く場所)
__init__.py
analysis.py ← 11関数すべてに docstring あり
main.py ← main() 関数に docstring あり
docs/
Makefile ← make html で使う
source/ ← Sphinx への「指示書」置き場
conf.py ← Sphinx の設定(Path設定・extensions・テーマ)
index.rst ← 目次のトップ(modules を参照)
modules.rst ← main.rst と analysis.rst を束ねる
analysis.rst ← water_potability.analysis を参照する命令
main.rst ← water_potability.main を参照する命令
build/html/ ← 完成したHTML(触らない・make html で生成される)
index.html / analysis.html / main.html …
data/ ← 分析データ(Sphinx とは無関係)
output/ ← 分析結果の出力先(Sphinx とは無関係)
この章はコピペで進める。理屈は4章以降に書いたので、まずここだけ読めばドキュメントが出来上がる。
3-1. インストール
プロジェクトルート(water_potability_html/)で実行する。
uv add sphinx sphinx-rtd-theme で同じ結果が得られる。
3-2. quickstart ― docs フォルダを生成する
この手順は すでに docs/ フォルダがある場合はスキップ する。今回の water_potability プロジェクトには既に docs/ が存在しているので読み飛ばしてよい。新しくゼロから始める場合の参考として示す。
対話プロンプト ― こう答える
> Separate source and build directories? (y/n) y > Project name: Water Potability Analysis > Author name(s): Matsun > Project release []: 0.1.0 > Project language [en]: ja
3-3. conf.py ― 実際のファイルをそのまま使う
今回のプロジェクトには docs/source/conf.py が既に用意されている。内容を確認しておこう。
import os, sys from pathlib import Path # ① パス設定 ─ Sphinx がコードをインポートできるようにする ROOT = Path(__file__).resolve().parents[2] # docs/source/ から2段上 = プロジェクトルート sys.path.insert(0, str(ROOT)) # ② プロジェクト情報 project = 'Water Potability Analysis' copyright = '2026, Matsun' author = 'Matsun' release = '0.1.0' # ③ 拡張機能 ─ 最重要 extensions = [ 'sphinx.ext.autodoc', # docstring から自動でドキュメント生成 'sphinx.ext.napoleon', # Google/NumPy スタイルの docstring を解釈 'sphinx.ext.viewcode', # ソースコードへのリンクを追加 'sphinx.ext.todo', # TODO ディレクティブ ] # ④ autodoc の設定 autodoc_default_options = { 'members': True, 'member-order': 'bysource', # ソース定義順に並べる 'undoc-members': False, # docstring なしは除外 'show-inheritance': True, } # ⑤ napoleon の設定 napoleon_google_docstring = True napoleon_numpy_docstring = True napoleon_use_admonition_for_notes = True language = 'ja' html_theme = 'sphinx_rtd_theme'
3-4. sphinx-apidoc ― .rst スタブを自動生成する
今回も既に docs/source/ に analysis.rst・main.rst・modules.rst が存在する。docstring を修正した後や新しい関数を追加した際に 再実行して .rst を更新 する。
プロジェクトルートから実行する。最後の引数は ドキュメント化したいパッケージのパスだ。
実行後、docs/source/ の .rst が更新される。実際の中身は次のとおりだ。
water_potability ================ .. toctree:: :maxdepth: 4 main analysis
analysis module =============== .. automodule:: water_potability.analysis :members: :undoc-members: :show-inheritance:
実際の index.rst では toctree に modules だけが書かれている。modules.rst がさらに main と analysis を束ねる2段構成になっている。
# docs/source/index.rst の toctree(実際のファイル) .. toctree:: :maxdepth: 2 :caption: Contents: modules ← modules.rst を含める(modules.rst がさらに main/analysis を束ねる)
3-5. make html ― ビルドして確認する
docs/ フォルダに移動して make html を実行する。
terminal
cd docs make html # 成功すると: # build succeeded. # The HTML pages are in build/html.
ビルド後、docs/build/html/index.html をブラウザで開く。
# macOS open docs/build/html/index.html # Windows start docs/build/html/index.html
docs/build/html/analysis.html を開くと、load_data()・evaluate_model() など11関数の説明が並んでいるはずだ。docstring を修正したら make html を再実行するだけで反映される。
情報は次の流れで一方通行に処理される。
water_potability/main.py ← main() 関数
docs/source/main.rst ←「water_potability.main の docstring を読め」という命令
docs/source/modules.rst ← main と analysis を束ねる目次
docs/source/index.rst ← 全体の目次トップ(modules を参照)
docs/build/html/main.html ← main() のドキュメント
docs/build/html/index.html ← サイトのトップページ
docs/build/ の中身は make html のたびに上書きされる。編集するのは常に docs/source/ の .rst か、water_potability/ の .py の docstring だ。
Path 設定 ― なぜ parents[2] なのか
今回の conf.py では os.path.abspath ではなく pathlib.Path を使っている。
ROOT = Path(__file__).resolve().parents[2] sys.path.insert(0, str(ROOT)) # Path(__file__) = docs/source/conf.py の絶対パス # .parents[0] = docs/source/ # .parents[1] = docs/ # .parents[2] = water_potability_html/ ← プロジェクトルート # # sys.path に追加することで Python は # water_potability/ パッケージを発見できるようになる
autodoc は .. automodule:: water_potability.analysis という命令を受けると、Python が実際に water_potability.analysis をインポートしてその docstring を取得する。パスが通っていないと ImportError になる。
extensions の各役割
.. automodule:: ディレクティブを解釈する。:param: 形式(RST スタイル)だけでなく、Google スタイル・NumPy スタイルも解釈できるようにする通訳。今回の analysis.py は RST スタイルを使っている。member-order: bysource でソース定義順(analysis.py の関数が上から順)に表示される。undoc-members: False で docstring のない関数は非表示になる。
今回のプロジェクトでは目次が 2段構成になっている。
modules を参照
main と analysis を参照
automodule 命令
docstring を取得
核心は .. automodule:: 命令だ。
analysis module =============== .. この1行が核心。autodoc に「water_potability.analysis を Python としてインポートして、全メンバーの docstring を HTML に変換しろ」と指示する .. automodule:: water_potability.analysis :members: :undoc-members: :show-inheritance:
.rst ファイルはコードを直接読まない。「autodoc にコードを読ませるための命令書」だ。sphinx-apidoc はこの命令書を自動生成するツール。自分でゼロから書く必要はない。
analysis.py は RST スタイル(:param:・:type:・:return:・:rtype:・:raises:) を採用している。napoleon 拡張がなくても Sphinx 本来の書き方として認識される。
analysis.py の全関数一覧
11個の関数がすべて docstring を持ち、ドキュメントに反映される。
output/figures と output/tables を作成する(存在する場合はスキップ)。
ローカル CSV を読み込んで DataFrame を返す。FileNotFoundError・ValueError を送出する可能性がある。
head()・shape・info() を標準出力に表示する。
欠損数と欠損率を集計し、tables/missing_values.csv に保存する。
Potability のクラス比率を確認し、tables/target_ratio.csv に保存する。
9特徴量のヒストグラム(40 bin・3列グリッド)を figures/histograms.png に保存する。
Potability(0/1)でグループ分けした箱ひげ図を figures/boxplots_by_target.png に保存する。
全列のピアソン相関係数ヒートマップ(RdBu_r)を figures/correlation_matrix.png に保存する。
層化抽出(stratify)で train/test に分割する。TEST_SIZE=0.2・RANDOM_STATE=42。(X_train, X_test, y_train, y_test) を返す。
中央値補完(SimpleImputer)→ 標準化(StandardScaler)→ ロジスティック回帰(max_iter=1000)の未学習パイプラインを返す。
Accuracy・F1・ROC-AUC を算出し、metrics.csv・confusion_matrix.csv・classification_report.csv に保存する。{'accuracy': …, 'f1': …, 'roc_auc': …} を返す。
docstring の実例 ― load_data()
実際の load_data() の docstring と、それが HTML でどう表示されるかを対応させて確認する。
def load_data(csv_path: Path) -> pd.DataFrame: """ローカル CSV を読み込んで DataFrame を返す。 :param csv_path: 読み込む CSV ファイルのパス。 :type csv_path: Path :return: 読み込んだデータ。 :rtype: pd.DataFrame :raises FileNotFoundError: 指定されたファイルが存在しない場合。 :raises ValueError: CSV の読み込みに失敗した場合。 """
:param 名前: → 引数の説明
:type 名前: → 引数の型
:return: → 戻り値の説明
:rtype: → 戻り値の型
:raises 例外名: → 発生しうる例外
Sphinx はこれを解析して引数テーブル・戻り値・例外一覧を HTML に変換する。napoleon 拡張があれば Google/NumPy スタイルでも書ける。
定数もドキュメント化される
analysis.py の先頭には定数が定義されているが、docstring がないためデフォルト設定(undoc-members: False)では非表示になる。表示させたい場合は #: でコメントを付ける。
# 現在のコード(undoc-members: False なので非表示) TARGET_COL = "Potability" RANDOM_STATE = 42 TEST_SIZE = 0.2 # #: を付けると Sphinx が認識して表示される TARGET_COL = "Potability" #: 目的変数のカラム名 RANDOM_STATE = 42 #: 乱数シード(再現性確保のため固定) TEST_SIZE = 0.2 #: テストデータの割合(全体の 20%)
まず確認するチェックリスト
- conf.py の
ROOT = Path(__file__).resolve().parents[2]が water_potability_html/ を指しているか(parents[2]の数が正しいか) - docs/source/index.rst の toctree に
modulesが書いてあるか - docs/source/modules.rst の toctree に
mainとanalysisが書いてあるか - toctree のインデントが 半角スペース3個 になっているか(Tab・2個・4個はNG)
- water_potability/__init__.py が存在するか(パッケージとして認識される必要がある)
- 新しい関数を追加したあと
sphinx-apidocを再実行して .rst を更新したか
エラーメッセージ別対処
autodoc は water_potability/analysis.py を実際にインポートするため、pandas・matplotlib・scikit-learn が仮想環境に入っていないとこのエラーが出る。
解決策 A:ライブラリをインストールする。
pip install pandas matplotlib scikit-learn
解決策 B:conf.py にモック設定を追加してインポートをスキップする。
autodoc_mock_imports = ['pandas', 'matplotlib', 'sklearn', 'numpy']
.rst ファイルが存在するのに toctree から参照されていない。
docs/source/modules.rst の toctree ブロックに、警告に出ているファイル名(拡張子なし)を追記する。インデントはスペース3個。
3つの原因が考えられる。
1. sys.path が通っていない:conf.py の parents[2] がプロジェクトルートを指しているか確認する。print(ROOT) を conf.py に一時的に追加して make html を実行すると確認できる。
2. undoc-members: False の影響:今回の設定では docstring のない関数は非表示になる。analysis.py の関数に docstring が書かれているか確認する。
3. sphinx-apidoc の再実行が必要:analysis.py に新しい関数を追加した後は sphinx-apidoc を再実行して .rst を更新する必要がある。
_save_table() はアンダースコアで始まる内部関数だが、autodoc_default_options の members: True により表示される場合がある。
非表示にするには conf.py を次のように変更する。
autodoc_default_options = {
'members': True,
'private-members': False, # _ 始まりは非表示(追加)
'undoc-members': False,
'member-order': 'bysource',
}
今回の conf.py には language = 'ja' が既に設定されているので通常は発生しない。発生した場合は次を確認する。
# conf.py に存在するか確認 language = 'ja' # .py ファイルの先頭に encoding 宣言があるか(Python 3 では通常不要) # -*- coding: utf-8 -*-
9まとめ
インストール pip install sphinx sphinx-rtd-theme
スタブ更新 sphinx-apidoc -f -o docs/source water_potability (conf.py・index.rst は既に用意済み)
ビルド cd docs && make html → docs/build/html/analysis.html に11関数のドキュメントが出力される
以降は analysis.py の docstring を書き直したら make html を再実行するだけだ。コードとドキュメントが常に同期した状態で維持できる。