概要(モジュールは「機能ごとに分けた 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))
Pythonfrom … import で「必要な名前だけ取り出す」
モジュールから特定の関数やクラスだけを直接取り出せます。読みやすく短く書けますが、どのモジュールの関数かが行からは分かりにくくなるので、公開 API では使いすぎに注意します。
from math import pi, sqrt
print(pi, sqrt(9)) # 3.1415... 3.0
Pythonas で「別名(エイリアス)をつけて可読性を上げる」
長いモジュール名や衝突しそうな名前には別名をつけます。業界慣習の短縮名(例: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()
Pythonsys.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()
Pythonpython 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 で解消する。パッケージ構造で階層を整え、標準モジュールを最大限活用する——この基本を身につけると、あなたのコードはスッキリ分割され、強く拡張しやすくなります。
