5-2

モジュールの作り方

自作モジュールの仕組み📄mylib.pydef hello(): ...関数・変数を定義import📄main.pyimport mylibmylib.hello()

自作モジュールとは

自分で作成した .py ファイルもモジュールとして他のファイルからインポートできます。同じコードを複数のプログラムで再利用する際に便利です。

モジュールの作成

例として、mymath.py というモジュールを作ります。

python
# mymath.py"""自作の数学モジュール"""PI = 3.141592653589793def add(a, b):    """2つの数の和を返す"""    return a + bdef subtract(a, b):    """2つの数の差を返す"""    return a - bdef circle_area(r):    """円の面積を返す"""    return PI * r * r
python
# main.py(同じディレクトリに置く)import mymathprint(mymath.PI)            # 3.141592653589793print(mymath.add(3, 4))     # 7print(mymath.circle_area(5))  # 78.54...

__name__ 変数

Pythonファイルは、直接実行されたときとモジュールとしてインポートされたときで動作を変えることができます。

python
# mymath.py"""自作の数学モジュール"""def add(a, b):    return a + b# このブロックは直接実行したときのみ実行されるif __name__ == "__main__":    # テストコード    assert add(1, 2) == 3    print("テスト完了!")    print(add(10, 20))  # 30
  • 直接実行(python mymath.py): __name__"__main__"
  • インポート時(import mymath): __name__"mymath"

パッケージの作成

関連するモジュールをまとめたパッケージ(ディレクトリ)を作ることができます。

mypackage/
    __init__.py       ← パッケージとして認識させるファイル
    math_utils.py
    string_utils.py
python
# mypackage/__init__.py# パッケージの初期化ファイル(空でもOK)# よく使う関数をパッケージレベルでエクスポートfrom .math_utils import add, subtractfrom .string_utils import count_vowels
python
# mypackage/math_utils.pydef add(a, b):    return a + bdef subtract(a, b):    return a - b
python
# main.pyimport mypackagefrom mypackage import math_utilsfrom mypackage.string_utils import count_vowelsmypackage.add(1, 2)       # 3(__init__.py でエクスポート済み)math_utils.subtract(5, 3)  # 2

相対インポートと絶対インポート

パッケージ内では、相対インポート(. を使う)が使えます。

python
# mypackage/math_utils.py# 絶対インポートfrom mypackage.string_utils import count_vowels# 相対インポート(同じパッケージ内)from .string_utils import count_vowelsfrom ..other_package import something  # 上の階層

モジュール検索パス

Pythonがモジュールを探す場所は sys.path で確認できます。

python
import sys# モジュール検索パスの一覧for path in sys.path:    print(path)# 検索パスに追加sys.path.append("/path/to/my/modules")

練習: 自作モジュールを作る

基礎

以下の関数を含む stats.py モジュールを作成してください:

  • mean(data): 平均値
  • median(data): 中央値