Pythonで分かりやすい関数名を付けることは、コードの可読性を高める上で非常に重要です。名前が処理内容を的確に表していれば、他の開発者や未来の自分がコードを素早く理解する助けとなります。
特に、関数の命名で最も重要な要素である**「動詞」**の選び方は、コードの意図を左右します。get
や save
といった便利な動詞をつい使いがちですが、より具体的で適切な動詞を選ぶことで、コードはさらに雄弁になり、読む人が実装の詳細を推測しやすくなります。
「get」がもたらす曖昧さ
例えば、get_latest_news()
という関数名を見てみましょう。この名前から「最新ニュースを取得する」ことは分かります。しかし、どのように取得するのかまでは分かりません。
- ネットワーク上のAPIから**取得(fetch)**するのでしょうか?
- ローカルのファイルから**読み込む(load)**のでしょうか?
- データベースの中から**検索(search)**するのでしょうか?
get
は汎用性が高い反面、具体的な処理のニュアンスを伝えきれない場合があります。ここで、より具体的な動詞を選ぶことが活きてきます。
状況に応じて動詞を使い分ける
「get」をより具体的にする動詞
「取得する」という操作にも、その背景には様々なコンテキストが存在します。状況に応じて以下の動詞を使い分けることで、関数の役割がより明確になります。
動詞 | ニュアンス・利用シーン |
fetch , retrieve | ネットワーク越しのリソース(API、ウェブページ)を取得する際に使う。 |
load | ファイルや設定など、既存のデータをメモリに読み込む際に使う。 |
search | 複数のデータの中から、条件に合うものを探し出す際に使う。 |
calculate | 与えられた情報から、特定の値を計算・算出する際に使う。 |
aggregate | 複数のデータを集計して、合計値や平均値などを求める際に使う。 |
build , construct | 複数の部品から、複雑なオブジェクトやデータ構造を組み立てる際に使う。 |
render | データやテンプレートを元に、HTMLや画像などを描画・生成する際に使う。 |
具体例:get
から fetch
へ
外部APIから記事の情報を取得する関数を考えてみましょう。
import requests
class Article:
# ... Articleの定義 ...
def __init__(self, title: str, body: str):
self.title = title
self.body = body
# 悪くはないが、曖昧な例
def get_article(article_id: int) -> Article | None:
# 実装を読まないと、ネットワーク通信が発生することが分からない
response = requests.get(f"https://api.example.com/articles/{article_id}")
if response.status_code == 200:
data = response.json()
return Article(title=data["title"], body=data["body"])
return None
# 意図が明確な例
def fetch_article_from_api(article_id: int) -> Article | None:
# 関数名から、APIへのアクセスが発生することが明確に分かる
response = requests.get(f"https://api.example.com/articles/{article_id}")
if response.status_code == 200:
data = response.json()
return Article(title=data["title"], body=data["body"])
return None
fetch
という動詞を使うだけで、この関数がネットワーク通信を伴う処理であることが一目瞭然となります。
「save」をより具体的にする動詞
「保存する」という操作も同様に、文脈によって様々な表現が可能です。
動詞 | ニュアンス・利用シーン |
dump | メモリ上のデータ(辞書など)を、特定の形式(JSON, YAML)でファイルに出力する。 |
create | 新しいレコードやリソースを永続化層(DBなど)に作成する。 |
update , patch | 既存のレコードやリソースを更新する。patch は部分更新のニュアンス。 |
remove , delete | 既存のレコードやリソースを削除する。 |
sync | 二つの異なる場所にあるデータを同期させ、同じ状態にする。 |
具体例:save
から dump
へ
アプリケーションの設定情報をJSONファイルとして書き出す場面です。
import json
# 曖昧な例
def save_config(config: dict, file_path: str) -> None:
with open(file_path, "w", encoding="utf-8") as f:
json.dump(config, f, indent=2)
# 意図が明確な例
def dump_config_to_json(config: dict, file_path: str) -> None:
# データ構造をJSON形式で書き出す、という意図が明確
with open(file_path, "w", encoding="utf-8") as f:
json.dump(config, f, indent=2)
その他の便利な動詞
その他にも、特定の処理内容を的確に表現する便利な動詞が数多く存在します。
動詞 | ニュアンス・利用シーン |
notify | ユーザーや他のシステムに情報を通知する。(send より具体的) |
flatten | 入れ子になったリストなどを、一次元のフラットなリストに変換する。 |
minimize | (ウィンドウなどを)最小化する、またはデータ量を最小限に圧縮する。 |
validate , verify | データが正しい形式やルールに則っているかを検証する。 |
escape , sanitize | セキュリティ上の問題を防ぐため、文字列を無害化(エスケープ)する。 |
まとめ
汎用的な動詞は便利ですが、常にそれが最良の選択とは限りません。
関数の命名において、より具体的で文脈に合った動詞を選ぶことは、コードの意図を正確に伝え、将来の自分や他の開発者が実装を理解する助けとなります。それは、コードを自己文書化(self-documenting)するための重要なステップです。
今回ご紹介した動詞の使い分けを意識して、より伝わりやすいコードを目指しましょう。