Pythonの独自モジュール作成とインポート:プログラムを複数ファイルに分割する方法

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__": ブロック内に記述することで、インポート時の意図しない実行を防ぎます。

ファイルを分割することで、コードの見通しが良くなり、再利用性も高まります。

よかったらシェアしてね!
  • URLをコピーしました!
  • URLをコピーしました!

この記事を書いた人

私が勉強したこと、実践したこと、してることを書いているブログです。
主に資産運用について書いていたのですが、
最近はプログラミングに興味があるので、今はそればっかりです。

目次