Skip to article frontmatterSkip to article content
Site not loading correctly?

This may be due to an incorrect BASE_URL configuration. See the MyST Documentation for reference.

コメントとdocstring

コードは一度書いて終わりではなく,後から自分や他者が読み返すもの. ここでは,コードを説明する基本として,コメント・docstring・ヘルプの読み方をまとめる.

コメント # を見直す

# から行末まではコメント (comment)で,実行時には無視される. コメントは「何をしているか(what)」をなぞるよりも,「なぜそうするか(why)」を書くと価値が高い. コードを読めばわかることの繰り返しは避ける.

t = 9
t_max = 10

# 悪い例:コードを読めばわかる what をなぞっている
t = t + 1  # t に 1 を足す

# 良い例:なぜそうするか(why)を書く
if t >= t_max:  # 最終世代に達したらシミュレーションを止める
    print("終了")
終了

本演習では,コメントは日本語で書き,スライドと対応するコードには # XX-YY. タイトル の番号を付ける慣例.

docstring を書く

docstringは,関数などの先頭に置く説明用の文字列である.def の直後に """...""" で書く.

def add(a, b):
    """2つの数の和を返す関数."""
    return a + b

引数や戻り値が複数あるときは,書式を決めて節ごとに整理すると読みやすい. Google スタイル(Args:Returns:)と NumPy スタイル(ParametersReturns)が代表的 napoleon 拡張

下の例は Google スタイル.

import numpy as np


def log_spiral(a, r0, theta):
    """対数らせんの座標値を返す関数.

    Args:
        a: らせんの拡大率
        r0: 動径の初期値
        theta: 回転角

    Returns:
        x, y: らせん上の座標値

    """
    r = r0 * np.exp(a * theta)
    x = r * np.cos(theta)
    y = r * np.sin(theta)

    return (x, y)

同じ関数を NumPy スタイルで書くと次のようになる.

def log_spiral(a, r0, theta):
    """対数らせんの座標値を返す関数.

    Parameters
    ----------
    a : float
        らせんの拡大率
    r0 : float
        動径の初期値
    theta : float or ndarray
        回転角

    Returns
    -------
    x, y : float or ndarray
        らせん上の座標値
    """
    r = r0 * np.exp(a * theta)
    x = r * np.cos(theta)
    y = r * np.sin(theta)

    return (x, y)

これは P2-01 の対数らせんモデルで実際に使う関数. docstring を書いておくと,自作関数も「使い方が説明された部品」になる.

docstring・ヘルプを読む

書いた docstring は,あとから呼び出して読める. 標準ライブラリ・NumPy・自作関数のいずれも同じ仕組みで,未知の関数に出会ったらまずヘルプを読む,というのが調べ方の基本.

Colab/Jupyter では次の方法が使える.

help(log_spiral)
Help on function log_spiral in module __main__:

log_spiral(a, r0, theta)
    対数らせんの座標値を返す関数.
    
    Args:
        a: らせんの拡大率
        r0: 動径の初期値
        theta: 回転角
    
    Returns:
        x, y: らせん上の座標値

書く(docstring)と読む(ヘルプ)は表裏の関係にあり,自分が書いた docstring も他人が書いたものとまったく同じように読める.

自動化

Sphinx の napoleon 拡張が解釈し,docstring からドキュメントを自動生成できる.

コメントや docstring を含め,コードの体裁を一定に保つにはリンタ・フォーマッタが役立つ. 本リポジトリでは Ruff を用い,整形(ruff format)と検査(ruff check)を自動化している. 関数の引数や戻り値の型をコードに明記する型ヒントなどもある.

まとめ