Pythonでプログラムの規模が大きくなってくると、すべてのコードを1つのファイル(.py)に記述するのは管理が難しくなります。
そのような場合、機能ごとに関数やクラスを別々のファイルに分割し、必要に応じて読み込む(インポートする)のが一般的です。この分割された個々のファイルを**「モジュール」**と呼びます。
この記事では、独自のモジュールを作成し、別のスクリプトから利用する基本的な手順について解説します。
1. モジュールの作成(定義側)
モジュールの作成は非常に簡単です。単に、拡張子が .py のファイルを作成し、そこに関数や変数を記述するだけです。
例として、計算機能を提供するモジュール math_utils.py を作成します。
ファイル名: math_utils.py
# モジュール変数
APP_NAME = "Simple Calculator"
DEFAULT_TAX_RATE = 0.1
def add(x, y):
"""2つの数値を足す関数"""
print(f"[math_utils] add関数が呼ばれました: {x} + {y}")
return x + y
def subtract(x, y):
"""2つの数値を引く関数"""
return x - y
これで、math_utils という名前のモジュールが定義されました。
2. モジュールの利用(呼び出し側)
作成したモジュールを利用するには、利用したいスクリプト(ここでは main.py とします)と同じディレクトリ(フォルダ)にモジュールファイルを配置し、import 文を使用します。
ファイル名: main.py
# 作成した math_utils モジュールをインポート
# (拡張子 .py は不要です)
import math_utils
print("--- 処理開始 ---")
# 1. モジュール内の関数を利用する
# モジュール名.関数名 でアクセス
result_add = math_utils.add(10, 20)
print(f"足し算の結果: {result_add}")
result_sub = math_utils.subtract(50, 30)
print(f"引き算の結果: {result_sub}")
# 2. モジュール内の変数を利用する
# モジュール名.変数名 でアクセス
print(f"アプリケーション名: {math_utils.APP_NAME}")
print(f"デフォルト税率: {math_utils.DEFAULT_TAX_RATE}")
実行方法: ターミナルで main.py を実行します。
python main.py
実行結果:
--- 処理開始 ---
[math_utils] add関数が呼ばれました: 10 + 20
足し算の結果: 30
引き算の結果: 20
アプリケーション名: Simple Calculator
デフォルト税率: 0.1
このように、import モジュール名 を記述することで、そのファイル内で定義された関数や変数に モジュール名. というプレフィックス(接頭辞)を付けてアクセスできるようになります。
特定の機能だけをインポートする場合 (from ... import ...)
モジュール全体ではなく、特定の関数や変数だけを使いたい場合は、from を使ったインポートが便利です。この場合、プレフィックスなしで直接名前を使えます。
ファイル名: main_from.py
# math_utils から add 関数と APP_NAME 変数だけをインポート
from math_utils import add, APP_NAME
print(f"アプリ: {APP_NAME}")
# 'math_utils.' を付けずに直接呼び出せる
result = add(5, 5)
print(f"結果: {result}")
重要な慣習:if __name__ == "__main__":
モジュールファイル(math_utils.py)の中に、動作確認用のコードを書きたい場合があります。しかし、そのまま書くと、import しただけでそのコードが実行されてしまいます。
これを防ぐために、以下のような if 文を使用するのがPythonの重要な慣習です。
修正後の math_utils.py
# ... (変数や関数の定義は同じ) ...
def add(x, y):
return x + y
# このファイルが「直接実行された場合」のみ実行されるブロック
if __name__ == "__main__":
print("--- math_utilsのデバッグ実行 ---")
print(add(1, 1))
python math_utils.pyと直接実行した場合:ifブロックの中身が実行されます。import math_utilsとインポートされた場合:ifブロックの中身は実行されません(関数定義だけが行われます)。
まとめ
- モジュール作成: 関数や変数を記述した
.pyファイルを作成します。 - インポート: 利用する側で
import ファイル名(拡張子なし)を記述します。 - 利用:
モジュール名.関数名()のようにアクセスします。 - テストコード:
if __name__ == "__main__":ブロック内に記述することで、インポート時の意図しない実行を防ぎます。
ファイルを分割することで、コードの見通しが良くなり、再利用性も高まります。
