Python | 関数:モジュールとは

Python
スポンサーリンク

概要(モジュールは「機能ごとに分けた Python ファイル」で再利用の単位)

モジュールとは、関数・クラス・定数などをひとまとめにした Python ファイル(.py)のことです。目的別にコードを分割し、必要なときに import して使えるようにします。これにより、再利用性が上がり、保守が楽になり、名前の衝突も避けやすくなります。

# math モジュールを使う例
import math
print(math.sqrt(16))  # 4.0
Python

基本のインポートと名前空間(ここが重要)

import で「モジュールを読み込み、名前空間にぶら下げる」

import はモジュール全体を読み込み、そのモジュール名の“名前空間”の下に中身をぶら下げます。関数や定数にアクセスするときは「module_name.名前」です。

import random
print(random.randint(1, 6))
Python

from … import で「必要な名前だけ取り出す」

モジュールから特定の関数やクラスだけを直接取り出せます。読みやすく短く書けますが、どのモジュールの関数かが行からは分かりにくくなるので、公開 API では使いすぎに注意します。

from math import pi, sqrt
print(pi, sqrt(9))  # 3.1415... 3.0
Python

as で「別名(エイリアス)をつけて可読性を上げる」

長いモジュール名や衝突しそうな名前には別名をつけます。業界慣習の短縮名(例:import numpy as np)を使うと、読み手が理解しやすくなります。

import datetime as dt
print(dt.datetime.now())
Python

モジュールを自作する(作成・配置・読み込み)

まずは .py ファイルを作る

関数や定数を定義した Python ファイルが、そのままモジュールになります。同じディレクトリにある別ファイルから import できます。

# utils.py
def greet(name: str) -> str:
    return f"こんにちは、{name}さん!"
Python
# main.py(同じフォルダ)
import utils
print(utils.greet("花子"))
Python

モジュールは“最初の import 時に一度だけ実行される”

モジュール直下のコードは import と同時に一度だけ実行されます。副作用(印字・ファイルアクセス)を避け、定義中心に保つのが基本です。テストやスクリプト起動用のコードは「if name == ‘main‘:」ブロックに入れると、import 時に実行されません。

# app.py
def run():
    print("アプリ開始")

if __name__ == "__main__":  # 直接実行されたときだけ動く
    run()
Python

モジュールとパッケージ(階層構造・相対インポート)

パッケージは「フォルダごとまとめたモジュール群」

パッケージは、モジュールをフォルダ階層で整理したものです。昔は init.py が必須でしたが、現代の Python ではなくても“名前空間パッケージ”として動作します。プロジェクトが大きくなったら、目的別ディレクトリで整理しましょう。

project/
  data/
    __init__.py
    loader.py
  core/
    __init__.py
    model.py
  main.py

相対インポートで「同じパッケージ内」を参照する

同じパッケージのモジュール同士は、相対インポートで目的を明確にできます。トップレベルからの絶対インポート(project.core.model など)も読みやすく、ツールが補完しやすいです。

# data/loader.py
from ..core.model import predict  # 1階層上の core から

def load_and_predict(path):
    ...
Python

実務で効く設計の勘所(副作用・循環参照・検索パス)

モジュール直下に副作用を置かない(定義中心に)

import しただけでファイルを書き換える・ネットアクセスする、といった副作用は避けます。定数・関数・クラスの定義を主にし、起動コードやデモは main ブロックへ。

循環インポート(相互 import)の回避

A が B を、B が A を import する循環は、読み込み順の問題で失敗しがちです。共通部分を別モジュールに切り出す、関数内で遅延 import する、依存方向を一本化するなどで解消します。

def handler():
    # 関数内で遅延 import(循環を避ける最終手段)
    from .service import run
    return run()
Python

sys.path と「どこから import できるか」

import は「現在のスクリプトのフォルダ」「インストール済みパッケージのパス」などを探索します。自作モジュールを別フォルダに置く場合は、パッケージとしてインストールするか、環境(仮想環境)に追加しましょう。開発中は絶対インポートを優先すると、path 操作に頼らず安定します。

標準モジュールの活用例(短いコードで力を借りる)

math・random・datetime・pathlib は最初の相棒

数学計算、乱数生成、日時操作、パス操作は標準で高品質です。自前実装を避け、まず標準モジュールに当たる癖をつけましょう。

import math, random
from datetime import datetime
from pathlib import Path

print(math.pi, math.sqrt(9))       # 円周率・平方根
print(random.choice(["A", "B"]))   # ランダム選択
print(datetime.now().isoformat())  # 現在時刻
print(Path("data") / "input.csv")  # OS差を吸収するパス結合
Python

例題で身につける(定番から一歩先まで)

例題1:自作モジュールの分割と再利用

# textutil.py
def normalize(s: str) -> str:
    return s.strip().casefold()

def slugify(s: str) -> str:
    return "-".join(normalize(s).split())
Python
# blog.py
import textutil
print(textutil.slugify("  Coffee Latte  "))  # 'coffee-latte'

例題2:from import と as で短く書く

# calc.py
from math import sqrt as root

def hypotenuse(a: float, b: float) -> float:
    return root(a*a + b*b)

print(hypotenuse(3, 4))  # 5.0
Python

例題3:main で「実行時だけ」動かす

# cli.py
def run():
    print("CLI を起動")

if __name__ == "__main__":
    run()
Python
python cli.py     # 起動(run 実行)
python -c "import cli"  # 何も出ない(定義のみ)

例題4:循環インポートを分解して解消

# before
# a.py -> import b
# b.py -> import a  # ここで循環

# after
# common.py に共通関数を移動
# a.py, b.py は common を参照

まとめ

モジュールは「機能ごとに分けた Python ファイル」であり、再利用・保守・可読性の要です。import は名前空間にぶら下げ、from import は必要な名前だけ取り出す。副作用は main に隔離し、循環インポートは依存整理か遅延 import で解消する。パッケージ構造で階層を整え、標準モジュールを最大限活用する——この基本を身につけると、あなたのコードはスッキリ分割され、強く拡張しやすくなります。

タイトルとURLをコピーしました