メインコンテンツへスキップ

SphinxでPython docstringからドキュメントを自動生成する

·2014 文字·5 分
目次

はじめに
#

ドキュメント生成ツールSphinxを使って、Pythonスクリプトのクラスや関数のdocstringからHTMLドキュメントを自動生成する方法を解説する。

おおまかな手順は以下の通り。

  1. Pythonスクリプトのdocstringに、クラスやメソッドの説明を書く
  2. SphinxでreStructuredText (reST) 形式のソースファイルを生成する
  3. SphinxでHTML形式のドキュメントを生成(ビルド)する

reSTはマークアップ言語の一種である。

環境
#

OSはWindows 10とした。

  • Python v3.8.5
  • Sphinx v3.2.1

インストール
#

condaまたはpipでインストールできる。

conda install sphinx
pip install sphinx

また、Sphinxには標準で10個のHTMLテーマが用意されている(以下リンク参照)。 HTML Theming — Sphinx documentation

テーマを追加することも可能。例えば、Jupyter Notebookのリファレンスで使われているテーマsphinx_rtd_theme (Read the Docs) を追加するには、以下を実行する。

conda install sphinx_rtd_theme

もちろん、pip install sphinx_rtd_themeでもインストール可能。

Read the Docsテーマ
Read the Docsテーマ
Jupyter Notebook documentation

Pythonスクリプトを用意する
#

以下のフォルダを用意し、main.py, sub.pyという2つのスクリプトを作成する。

project/
└── src/
    ├── main.py
    └── sub.py

各スクリプトのdocstringに、モジュール、クラス、関数の説明を記述する。 docstringの記述方法は、以下の3つがある。

  • reStructuredTextスタイル
  • Googleスタイル
  • NumPyスタイル

GoogleスタイルやNumPyスタイルで記述する場合は、Sphinxでドキュメントを作成するときに拡張機能を使う必要がある。

ここではGoogleスタイルとする。スクリプトの中身は以下の通り。

"""Module summary.

This is main.py.
"""
class MyClass:
    """Summary line.

    This is MyClass.
    """
    def sum_test(self, x, y):
        """sum 2 values.

        Args:
            x (float): 1st argument
            y (float): 2nd argument

        Returns:
            float: summation

        Examples:
            関数の使い方

            >>> print(sum_test(3.2, 5.3))
            8.5
        """
        return x + y

class MyClass2:
    """Summary line.

    This is MyClass2.
    """
    def sum_test2(self, x, y):
        """sum 2 values.

        Args:
            x (float): 1st argument
            y (float): 2nd argument

        Returns:
            float: summation

        Examples:
            関数の使い方

            >>> print(sum_test2(3.2, 5.3))
            8.5
        """
        return x + y
"""Module summary.

This is sub.py.
"""
class MyClass2:
    """Summary line.

    This is MyClass2.
    """
    def sum_test2(self, x, y):
        """sum 2 values.

        Args:
            x (float): 1st argument
            y (float): 2nd argument

        Returns:
            float: summation

        Examples:
            関数の使い方

            >>> print(sum_test2(3.2, 5.3))
            8.5
        """
        return x + y

reSTファイルの生成
#

カレントディレクトリをprojectフォルダとして、sphinx-apidocコマンドを実行し、reSTファイルを生成する。

sphinx-apidoc [OPTIONS] -o <OUTPUT_PATH> <MODULE_PATH>

<MODULE_PATH>はPythonスクリプトがあるフォルダである。 主なオプションは以下の通り。

オプション 意味
-F Sphinxプロジェクトをfullで生成する
-H プロジェクト名を指定
-A 著者を指定
-V プロジェクトのバージョンを指定
-o 出力先を指定

その他のオプションは以下を参照。 sphinx-apidoc — Sphinx documentation

ここでは、以下を実行する。

sphinx-apidoc -F -H project -A Helve -V v1.0 -o docs src

実行すると、projectフォルダの下にdocsフォルダが作成され、さらにその下に3個の空フォルダと6個のファイルが生成される。

project/
├── src/
│   ├── main.py
│   └── sub.py
└── docs/
    ├── _build/
    ├── _static/
    ├── _templates/
    ├── conf.py
    ├── index.rst
    ├── main.rst
    ├── make.bat
    ├── Makefile
    └── sub.rst

conf.pyの編集
#

生成されたconf.pyを開き、2箇所編集する。 まず、以下の3行のコメントを外す。

import os
import sys
sys.path.insert(0, '(略)\\project\\src')

次に、拡張機能 (extensions) に'sphinx.ext.napoleon'を追加する。これは、GoogleスタイルやNumpyスタイルでdocstringを記述した場合に必要である。

extensions = [
    'sphinx.ext.autodoc',
    'sphinx.ext.viewcode',
    'sphinx.ext.todo',
    'sphinx.ext.napoleon'
]

ちなみに、HTMLのテーマを変更したい場合は、html_themeを変更する。

html_theme = 'alabaster'

HTML形式のドキュメントを生成
#

HTML形式のドキュメントを生成するには、sphinx-buildコマンドを実行する(カレントディレクトリはprojectフォルダのままとする)。

sphinx-build [options] <sourcedir> <outputdir> [filenames ...]

<sourcedir>conf.pyがあるフォルダである(今回はdocs)。 <outputdir>はHTMLファイルの出力先である。どこでも良いが、今回は自動生成されたdocs/_buildフォルダとする。

よって、ここでは以下を実行する。

sphinx-build docs docs/_build

実行すると結果が20行程度に渡って表示されるが、build succeeded.と表示されたら成功である。

生成されたHTMLファイル
#

docs/_buildフォルダにHTMLファイルが生成されている。 index.htmlはトップページであり、モジュールの一覧が表示される。

index.html
index.html

個別のスクリプトのドキュメントは、同じ名前のHTMLファイルとなる(以下はmain.html)。モジュール、クラス、メソッドの説明が整形されて表示されている。

main.html
main.html

参考
#

Helve
著者
Helve
関西在住、電機メーカ勤務のエンジニア。X(旧Twitter)で新着記事を配信中です

関連記事

Scikit-learnのPolynomialFeaturesでべき乗を求める
·1917 文字·4 分
PolynomialFeaturesクラスの引数とメソッドについて解説する。また、特徴量の数を1~3まで変化させ、オプションによって出力がどのように変化するか確認する。
PythonのsubprocessでWindowsコマンドを実行
·960 文字·2 分
Pythonの標準ライブラリsubprocessを使ってWindowsのコマンドを実行する方法を解説する。
scikit-learnのBaggingClassifierでバギングする
·2756 文字·6 分
BaggingClassifierを用いた学習(バギング、ペースティング、ランダムサブスペース、ランダムパッチ)について解説する。
Scikit-learnの主成分分析 (PCA)
·1432 文字·3 分
Scikit-learnのPCAクラスのパラメータ、属性とメソッドについて解説する。
Scikit-learnの正則化付き重回帰モデル
·2498 文字·5 分
Scikit-learnに実装されている重回帰、Ridge回帰、Lasso回帰、Elastic Netのロジックと使用方法をまとめた。
Windows10のPowerShellでAnaconda Pythonを使う方法
·3581 文字·8 分
Windows10のPowerShellでAnaconda Pythonを使うための手順をまとめた。