プログラミングにおいて、「コードは書く時間よりも読まれれる時間の方が遥かに長い」という言葉があります。特にチームで開発を行う場合や、未来の自分がコードをメンテナンスする場合、そのコードがどれだけ読みやすいか(可読性)は、開発効率や品質に直接影響します。
そして、その可読性を大きく左右するのが「命名」です。
今回は、Pythonプログラミングの基本である「関数」の命名に焦点を当て、誰が読んでも処理内容を直感的に理解できるような、分かりやすい名前を付けるための実践的なルールをご紹介します。
なぜ関数名が重要なのか?
例えば、次のような関数があったらどうでしょうか。
# 悪い例
def proc_data(data):
# ... 何らかのデータ処理
return result
この proc_data
という名前から、具体的に何をする関数なのか想像できるでしょうか?データを処理することは分かりますが、それが「ユーザー情報を取得する」のか、「売上を集計する」のか、「ファイルを書き出す」のか、全く分かりません。これでは、中身のコードを一行ずつ読まないと、関数の役割を理解できません。
分かりやすい関数名は、コードの「見出し」や「要約」のような役割を果たします。良い名前が付いていれば、詳細な実装を読まなくても、その関数が何をするのかを正確に把握できるのです。
分かりやすい関数名にするための4つの基本ルール
それでは、具体的で分かりやすい名前を付けるための、今すぐ使える4つのルールを見ていきましょう。
ルール1:処理内容を表す「動詞」から始める
関数は「何らかの処理を行う」ものですから、その処理内容を明確に表す動詞で名前を始めるのが基本です。
get_
: 情報を取得するcalculate_
(またはcalc_
): 何かを計算するcreate_
: 新しい要素を生成するvalidate_
: 正しいかどうかを検証する
具体例
ユーザーIDを元にユーザー情報をデータベースから取得する関数を考えてみましょう。
from dataclasses import dataclass
@dataclass
class UserProfile:
id: int
name: str
email: str
# 良い例
def get_user_profile_by_id(user_id: int) -> UserProfile | None:
"""指定されたIDのユーザープロフィールを取得する"""
# ここにデータベースからデータを取得する処理
# ...
if user_found:
return UserProfile(id=1, name="Taro Yamada", email="taro@example.com")
return None
# 悪い例
# def user_data(user_id): ...
get_user_profile_by_id
という名前なら、「IDを使ってユーザープロフィールを取得するんだな」と一目で分かります。
ルール2:真偽値(True/False)を返す関数は is_
や has_
で始める
関数が「はい/いいえ」で答えられる質問、つまり真偽値(Boolean)を返す場合、名前を is_
や has_
で始めると非常に分かりやすくなります。
is_
: 〜であるかどうか(状態を問う)has_
: 〜を持っているかどうか(所有を問う)
具体例
ユーザーが成人かどうかを判定する関数です。
# 良い例
def is_adult(age: int) -> bool:
"""成人年齢(20歳以上)かどうかを判定する"""
return age >= 20
# 良い例
def has_permission(user: UserProfile) -> bool:
"""ユーザーが特定の権限を持っているか確認する"""
# 権限チェックのロジック
# ...
return True
if is_adult(user_age):
のように、if文と組み合わせたときに、自然な英文のように読めるのが理想です。
ルール3:外部への保存や書き込みは write_
や save_
を使う
関数が計算結果を返すだけでなく、ファイルに書き込んだり、データベースを更新したりといった**「副作用」**を持つ場合、それを明確にすることが重要です。write_
や save_
といった単語を使うことで、この関数を呼び出すとシステムの状態が変化することを示唆できます。
具体例
プログラムの実行ログをファイルに書き出す関数です。
import datetime
# 良い例
def write_log_message(message: str, log_file_path: str) -> None:
"""ログメッセージにタイムスタンプを付けてファイルに書き込む"""
timestamp = datetime.datetime.now().isoformat()
log_entry = f"[{timestamp}] {message}\n"
with open(log_file_path, mode="a", encoding="utf-8") as f:
f.write(log_entry)
# 悪い例
# def log(message, path): ...
write_
と付いていることで、この関数が何かを「書き込む」のだとすぐに理解できます。
ルール4:形式を変換する関数は to_
や as_
を使う
オブジェクトを別の形式(例えば、辞書型やJSON文字列)に変換する関数には、to_
や as_
を使うと目的が明確になります。
具体例
UserProfile
オブジェクトを辞書型に変換する関数です。
# 良い例
def user_profile_as_dict(user: UserProfile) -> dict:
"""UserProfileオブジェクトを辞書型に変換する"""
return {
"id": user.id,
"name": user.name,
"email": user.email
}
この命名により、元のオブジェクトは変更せず、新しい形式でデータを返すことが直感的に伝わります。
現代的なテクニック:型ヒントでさらに可読性を高める
最近のPython開発では、**型ヒント(Type Hinting)**の活用が一般的になっています。これは、関数の引数や返り値がどのようなデータ型であるべきかを明示する機能です。
def calculate_total_price(price: int, quantity: int, tax_rate: float) -> float:
"""税込みの合計金額を計算する"""
total = price * quantity
return total * (1 + tax_rate)
このように型ヒントを付けることで、
- 関数が何を期待し(引数)、何を返す(返り値)のかが明確になる
- エディタ(VSCodeなど)がリアルタイムでエラーを検出してくれる
- 関数名だけでは伝えきれない情報を補完できる
といったメリットがあり、関数名と組み合わせることで、コードの可読性と堅牢性が飛躍的に向上します。
まとめ
分かりやすい関数名を付けることは、単なるコーディングスタイルに留まりません。これは、将来のバグを未然に防ぎ、コードのメンテナンスコストを削減するための、具体的かつ効果的な技術です。
今回ご紹介したルールをコードに取り入れ、より保守性が高く、チーム全体にとって理解しやすいソフトウェア開発を目指しましょう。
目的 | 接頭辞の例 |
処理内容を表す | get_ , calculate_ , create_ , validate_ |
真偽値を返す | is_ , has_ |
外部へ保存・書き込み | write_ , save_ , export_ |
形式を変換する | to_ , as_ |