自作モジュールの作り方 | モジュールの作成 | Python本格超入門

スポンサーリンク
スポンサーリンク
amazon
スマイルSALE
--:--:--
~
ad. 価格範囲を指定して商品を探せます

自作モジュールの作り方

Pythonでは、プログラムの規模が大きくなるにつれてコードを1つのファイルに書き続けると、見通しが悪くなりメンテナンスが難しくなります。そこで重要なのが「モジュール」の活用です。

モジュールとは、関連する関数やクラスを独立したファイルに切り出したものです。自作モジュールを作成することで、コードをすっきりと整理できるだけでなく、他のプロジェクトやファイルから簡単に再利用できるようになります。

モジュールとは何か?

Pythonにおけるモジュールとは、一言で言えば「拡張子が .py のPythonファイル」そのものです。特別なツールを使う必要はなく、普段書いているスクリプトファイルがそのままモジュールとして機能します。これを他のファイルから import(インポート)して呼び出すことで、必要な機能だけをいつでも引き出すことができます。

モジュールの作成とインポートの手順

実際にシンプルな自作モジュールを作成し、別のファイルから読み込んで使う具体的な手順を見ていきましょう。

1. モジュールファイル(部品)の作成

まずは、他のファイルから呼び出したい関数をまとめたファイルを作成します。ここでは、ファイル名を mymodule.py とします。

# mymodule.py

def greet(name):
    """指定された名前に対して挨拶メッセージを返す関数"""
    return f"Hello, {name}!"

def add(a, b):
    """2つの数値を足し算する関数"""
    return a + b

2. メインファイル(実行側)からの呼び出し

次に、mymodule.py と同じフォルダ(ディレクトリ)内に、実行用となる main.py を作成します。

# main.py
import mymodule

name = "Alice"
# 「モジュール名.関数名」の形式で呼び出す
print(mymodule.greet(name))  # 出力: Hello, Alice!

result = mymodule.add(5, 3)
print(result)                # 出力: 8

このように、import mymodule と記述するだけで、ファイル名から拡張子を除いた名前がモジュール名として認識され、その内部の関数へ自由にアクセスできるようになります。

Pythonがモジュールを検索する仕組み(配置場所)

import 文が実行されると、Pythonはあらかじめ決められた優先順位に従って該当するファイルを探します。検索ルートは以下の通りです。

  1. 現在のディレクトリ(カレントディレクトリ):実行中のスクリプトと同じフォルダ。
  2. 環境変数 PYTHONPATH:ユーザーが独自に指定したディレクトリのリスト。
  3. 標準ライブラリおよびサードパーティ製ライブラリの設置先:Pythonのインストール時に自動生成されるシステムフォルダ。

自作モジュールを読み込ませる最も確実でシンプルな方法は、呼び出し元のスクリプト(例: main.py)と同じフォルダ内に配置することです。

開発中に役立つ知識:モジュールの再読み込み

対話型シェル(REPL)や一部の実行環境において、モジュールをインポートした後にそのモジュールのコード(.py ファイル)を修正することがあります。

しかし、Pythonはパフォーマンス向上のために「一度インポートしたモジュールはメモリにキャッシュする」という仕様になっています。そのため、再度 import mymodule を実行しても修正内容は反映されません。プログラムを再起動せずに最新の状態を反映させたい場合は、importlib ライブラリを使って強制的に再読み込みを行います。

import importlib
import mymodule

# (この間に mymodule.py を書き換えたと想定)

# キャッシュを破棄して最新のコードを再読み込みする
importlib.reload(mymodule)

さらにコードが大きくなったら:「パッケージ」への分割

1つのモジュールファイル(.py)の中に大量の関数やクラスが溜まってきたら、フォルダを分けて管理する「パッケージ」へとステップアップしましょう。

パッケージは、複数のモジュールファイルをまとめた「フォルダ(ディレクトリ)」のことです。フォルダの中に __init__.py という名前のファイル(中身は空で構いません)を配置することで、Pythonはそのフォルダを単なるディレクトリではなく、プログラムとしてインポート可能な「パッケージ」として認識するようになります。

my_project/
│
├── main.py          # 実行ファイル
└── my_package/      # パッケージ(フォルダ)
    ├── __init__.py  # パッケージ化に必要なファイル(空でOK)
    ├── utils.py     # 子モジュール1
    └── models.py    # 子モジュール2

この場合、メインファイルからは from my_package import utils のような形で、階層を指定してインポートします。

コードの価値を高める「ドキュメント化(docstring)」

自作したモジュールを自分以外の開発者や、未来の自分がスムーズに使うためには、説明書きが欠かせません。Pythonでは、関数やクラスの先頭に """三連ダブルクォーテーション""" で囲んだ文字列を記述することで、それを公式のドキュメント(docstring)として登録できます。

def greet(name):
    """指定された名前に対して挨拶メッセージを返す。

    Args:
        name (str): 挨拶する相手の名前。

    Returns:
        str: 組み立てられた挨拶の文字列。
    """
    return f"Hello, {name}!"

この仕組みの素晴らしい点は、利用側が help(mymodule.greet) を実行したり、高機能なエディタ(VS Codeなど)で関数にマウスカーソルを当てたりした際に、この説明がポップアップとして自動で表示されるようになる点です。

まとめ

Pythonにおける自作モジュール作成の重要ポイントは以下の通りです。

  • .pyファイルそのものがモジュール:関数やクラスを独立したファイルに切り出すだけで、再利用可能な部品になります。
  • 同一フォルダへの配置が基本:読み込みエラー(ModuleNotFoundError)を防ぐため、最初は呼び出し元の実行ファイルと同じ階層に配置して運用します。
  • importlib.reload()による効率化:開発中にモジュールを書き換えた際は、キャッシュの仕組みを理解し、必要に応じて再読み込みを活用します。
  • docstringによる品質担保:引数の型や戻り値の意味を """ 内に記載しておくことで、保守性が劇的に向上します。

機能を適切なサイズでモジュール化できるようになると、コードの可読性が上がるだけでなく、チーム開発や大規模なシステム構築への対応力が一気に高まります。