結論から言うと、モジュールを分けるときは、先に関数の役割を整理してから、関連する処理を別ファイルへ移すと進めやすいです。
Pythonのコードは、最初は1つのファイルで十分です。
しかし、読み込み、変換、集計、表示などの処理が増えてくると、どこに何が書いてあるのか分かりにくくなります。
この記事では、1つのファイルからモジュール分割へ進む基本の流れを、短いコードで整理します。
この記事でわかること
完成コード
完成コードは次の通りです。
# sales_tools.py に置く想定の処理
def calculate_total(items: list[dict[str, int]]) -> int:
return sum(item["price"] * item["quantity"] for item in items)
def format_total_message(total: int) -> str:
return f"売上合計は {total:,} 円です"
# main.py に置く想定の処理
orders = [
{"price": 1200, "quantity": 2},
{"price": 800, "quantity": 5},
{"price": 3000, "quantity": 1},
]
total = calculate_total(orders)
message = format_total_message(total)
print(message)実際にファイルを分ける場合は、sales_tools.py に関数を置き、main.py から次のように読み込みます。
from sales_tools import calculate_total, format_total_messageコードのポイント
このコードでは、売上データを集計する処理と、表示用のメッセージを作る処理を関数に分けています。
calculate_total()は合計金額の計算だけを担当していますformat_total_message()は表示用の文字列作成だけを担当していますmain.py側は、データを用意して関数を呼び出す流れに集中しています- 関連する関数を
sales_tools.pyにまとめると、再利用しやすくなります
モジュール分割は、ファイル数を増やすことが目的ではありません。
役割がはっきりした処理を、必要な場所から読み込めるようにするために行います。
コードを順番に説明します
主要な処理を分けて説明します。
1. 先に関数の役割を分けます
def calculate_total(items: list[dict[str, int]]) -> int:
return sum(item["price"] * item["quantity"] for item in items)この関数は、売上データの合計を計算します。
表示やファイル出力は行わず、計算結果を返すだけにしています。
モジュールを分ける前に、まず関数の責務を小さくすると整理しやすくなります。
1つの関数が多くの仕事をしている状態のまま別ファイルへ移しても、読みやすさはあまり改善しません。
2. 関連する処理を同じモジュールにまとめます
def format_total_message(total: int) -> str:
return f"売上合計は {total:,} 円です"この関数は、合計金額を表示用の文字列に変換します。
計算処理とは別の役割ですが、売上集計に関連する補助処理として同じモジュールに置けます。
実務では、同じ種類のデータを扱う関数や、同じ業務処理で一緒に使う関数を同じモジュールにまとめると探しやすくなります。
反対に、関係の薄い処理を何でも同じファイルに入れると、名前だけでは内容を予想しにくくなります。
3. メインの処理から読み込んで使います
from sales_tools import calculate_total, format_total_message
total = calculate_total(orders)
message = format_total_message(total)
print(message)ファイルを分けたあとは、main.py から必要な関数を import して使います。
メインのファイルには、処理の大きな流れだけが残ります。
この形にすると、売上合計の計算方法を直したいときは sales_tools.py を見ればよくなります。
どこを修正すればよいか判断しやすくなるのが、モジュール分割の大きな利点です。
実務で使うときのポイント
実務でモジュールを分けるときは、次の順番で考えると無理がありません。
- まず1つのファイルで動く形を作る
- 長くなった処理を、役割ごとに関数へ切り出す
- 関連する関数が増えてきたら、別モジュールにまとめる
main.pyには全体の流れを残す- ファイル名は、中身の役割が分かる名前にする
最初から細かく分けすぎると、どのファイルを見ればよいか分かりにくくなることがあります。
特に小さな自動化スクリプトでは、1つのファイルで十分な場合もあります。
第1章で扱った関数分割の考え方は、第5章のモジュール分割にもつながります。
次の 5-3 では、自分で作ったモジュールを実際に import して使う基本を整理します。