ドキュメンテーション文字列の過不足をレビューで補う技術

Pythonでは関数・クラス・モジュールに対してドキュメンテーション文字列(docstring)を記載できる。
しかし、形式的にdocstringが存在していても、それが有効なドキュメントとなっていないケースは少なくない。
レビューアーは「あるかどうか」ではなく、設計意図や使用方法が的確に伝わる内容かを判断し、必要に応じて指摘・補完を行う役割を担う。

本マニュアルでは、docstringの質と量に関するレビュー観点を整理し、実務コードに対してどう指摘し、どのように改善案を提示すべきかを解説する。

docstringの目的は「設計と意図の伝達」

docstringは単なる使用説明ではなく、コードがどのような前提・制約・責務を持っているかを明示するための設計補助情報である。
したがって、次のような観点でレビューする必要がある。

評価軸 確認ポイント
存在の確認 すべての公開関数・クラスにdocstringがあるか
引数と戻り値の記載 引数の型・意味・前提条件、戻り値の意味・返却条件が記載されているか
振る舞いの説明 副作用(例:ファイル書き込み、例外発生)や、設計意図が明示されているか
曖昧表現の排除 「処理します」「変換します」など曖昧な動詞で説明されていないか
自明な記述の排除 コードから明らかに分かる内容だけの説明になっていないか

不完全なdocstringの典型パターン

説明が不十分なdocstring
def upload_file(path: str, content: bytes) -> None:
    """ファイルをアップロードする"""
    ...
docstringレビュー
@Reviewer: 処理対象のpathが相対パスか絶対パスか、上書き可否、失敗時の挙動(例外発生など)について明記されていません。仕様を補うような内容を追記してください。

このように、docstringが「ある」ことに安心せず、読者がその関数を安全に使えるかを基準にレビューする。

docstringの質を高める構成要素

Googleスタイルなどの形式に従うことは参考になるが、実務では以下の4点を軸にレビューすると効果的である。

1. 関数の目的(何をするか、なぜ必要か)

ファイルをS3にアップロードし、必要に応じて上書き処理を行います。

2. 引数の仕様(型、意味、制約)

Args:
    path (str): アップロード対象ファイルのローカルパス。絶対パス必須。
    content (bytes): アップロードするファイル内容。空bytesは許容されない。

3. 戻り値の意味

Returns:
    str: アップロード先URL(成功時のみ)。失敗時は例外が発生します。

4. 副作用・例外

Raises:
    FileNotFoundError: 指定されたファイルが存在しない場合。
    S3UploadError: アップロードに失敗した場合。

docstringレビュー観点の流れ

UML Diagram

「書きすぎ」と「書かなすぎ」の境界線

レビューアーが悩むのは、どこまでdocstringを書くべきかという線引きである。
以下は実務での判断基準となる。

関数の性質 推奨される記述内容
内部のユーティリティ関数 docstringなし or 短文でOK(ただし型ヒント必須)
APIや公開関数 使用前提・副作用・例外などを詳述
抽象クラス・プロトコル 抽象メソッドには使用者向け仕様を丁寧に記載
テスト関数 テスト目的が複雑な場合は「何を保証するか」を明記する

docstringだけで仕様が伝わる状態を目指す

以下のような記述をdocstringだけで判断できる状態が理想である。

仕様が伝わるdocstringの例
def convert_to_csv(data: list[dict[str, Any]], include_header: bool = True) -> str:
    """
    与えられた辞書リストをCSV形式に変換します。

    Args:
        data (list[dict[str, Any]]): 各行を表す辞書のリスト。
        include_header (bool): ヘッダ行を付与するかどうか(デフォルト: True)

    Returns:
        str: CSV形式の文字列。ヘッダの有無はinclude_headerに従います。

    Raises:
        ValueError: 辞書のキー構造が一致していない場合。
    """

このレベルまで記載されていれば、IDE補完や自動ドキュメント生成でも十分に情報が伝わる。

不要なdocstringの削除もレビュー対象

無意味なdocstring
def get_id(user):
    """IDを取得する"""
    return user.id
冗長レビュー
@Reviewer: 自明な処理に対してdocstringが内容を繰り返しているだけです。削除するか、より仕様的な説明に変更してください。

まとめ:docstringレビューは設計の補完行為である

docstringレビューの目的は、コードそのものが持つ設計意図を明示化し、他者と共有可能にすることにある。
そのためには、レビューアー自身が「この関数を使う人の視点」で読み解き、不足があれば構造的に補うコメントを行う必要がある。

単に形式を整えるのではなく、ドキュメントとしての機能を果たしているかを評価基準とすることが、実務における本質的なdocstringレビューである。