Q1次の説明のうち、モジュール / パッケージ / ライブラリ の対応として正しいものはどれですか?
モジュールとパッケージ — import で別ファイルから読み込む
Python のモジュール・パッケージ・ライブラリの違いと、import 文で別ファイルから関数を読み込む仕組みを基礎から学びます。
Python のアプリケーションは、処理を複数のファイルに分割し、それらを組み合わせて動かす のが普通です。この記事では、モジュール と パッケージ という単位、そして別のファイルから機能を読み込む import 文の仕組みを整理します。
モジュール・パッケージ・ライブラリの違い
Python のコードを構造化する単位は、規模順に モジュール → パッケージ → ライブラリ の 3 段階に分かれます。モジュールは 1 つの .py ファイルそのもの、パッケージは複数のモジュールをまとめたフォルダ、ライブラリはさらに大きな配布単位です。
| 単位 | 実体 | 例 |
|---|---|---|
| モジュール | 1 つの .py ファイル | math_utility.py |
| パッケージ | __init__.py を含むフォルダ | my_app/database/ |
| ライブラリ | 複数のパッケージをまとめた配布物 | pandas / NumPy / requests |
標準ライブラリと外部ライブラリ
Python には最初から付属する 標準ライブラリ と、別途インストールが必要な 外部ライブラリ があります。math や os、json のような標準ライブラリは追加インストールなしで import だけで使えます。一方、pandas や requests などの外部ライブラリは pip install パッケージ名 でインストールしてから使います。
| 種類 | インストール | 代表例 |
|---|---|---|
| 標準ライブラリ | Python 本体に同梱(不要) | math / os / sys / json / datetime |
| 外部ライブラリ | pip install で追加 | pandas / numpy / requests |
自分で作ったモジュールを import する
標準ライブラリだけでなく、自分で書いた .py ファイルもモジュールとして import できます。ローカルで Python を動かすときは、main.py と読み込みたい math_utility.py を 同じフォルダに並べて置く だけで OK です。同じフォルダにあるファイルは、main.py から import math_utility と書くだけで読み込めます (拡張子 .py は書きません)。
- main.py — 実行ファイル。冒頭で
import math_utilityと書く - math_utility.py —
add()/multiply()を定義したモジュール
import math_utility と書くだけで隣の math_utility.py が見つかる。サブフォルダに入れる必要はない。import math_utility を書くと、Python が同じフォルダの math_utility.py を読み込み、その中の関数が math_utility.add(...) のようにモジュール名を前置して呼び出せる状態になる。import 時にファイル全体が実行される
import math_utility を書くと、Python は math_utility.py を 上から下まで一度実行 します。関数定義(def)はそのときに メモリ上に登録 され、後から math_utility.add(...) のように呼び出せる状態になります。関数の中身が実行されるわけではない のがポイントで、import の段階で動くのは関数定義の外に書かれたコード(モジュールトップレベルの処理)だけです。
import math_utility に到達した瞬間、Python は math_utility.py を上から下まで一度実行する。def で書かれた関数定義はメモリに登録され、後から math_utility.add(...) で呼び出せる状態になる。import で重い処理が走らないように注意
トップレベル とは、関数や class の中ではなく、ファイルの一番外側(インデントが付かない位置)に直接書かれたコードのことです。import すると Python はこのトップレベルを上から順に実行します。ここで重い処理(DB 接続・大きなファイル読み込み・無限ループなど)を書いてしまうと、import するだけで時間がかかってしまいます。実行は関数の中に閉じ込め、トップレベルには関数定義と最低限の初期化だけを書きましょう。
直接実行とインポートを区別する __name__
Python のファイルは大きく 2 つに分かれます — 直接実行するファイル(python xxx.py で起動するファイル)と、他のファイルから import されるファイル(モジュールとして読み込まれるファイル)です。同じファイルでも、どちらの立場で動いているかを判定 したい場面はよくあります — たとえば「直接実行されたときだけ動作確認用のコードを走らせたい」というケースです。
この判定には、Python が自動で用意する特殊変数 __name__ を使います。直接実行された ファイルでは __name__ の値が "__main__" になり、import された ファイルではモジュール名(ファイル名)になります。if __name__ == "__main__": の中に書いた処理は、そのファイルを直接実行したときだけ動きます。
__name__ は、python xxx.py で 直接実行 すると "__main__"、別ファイルから import されるとモジュール名(ファイル名)になる。# math_utility.py
def add(a, b):
return a + b
# 直接実行されたときだけ動作確認を走らせる
if __name__ == "__main__":
print("動作確認:", add(10, 20)) # 30
# 他のファイルから import math_utility された場合は、
# 上の if ブロックは実行されない(add 関数だけ提供される)
複数の自作モジュールを組み合わせる
実際のアプリケーションでは、関数を 役割ごとに別ファイルに分けて 配置し、main.py からまとめて読み込むのが基本パターンです。たとえば、入力チェックは validator.py、表示用の整形は formatter.py、というように責務を分割します。こうしておくと「整形ルールだけ後から変えたい」「検証ロジックを増やしたい」となっても、該当ファイルだけ書き換えれば済み、main.py は触らずに変更を吸収できます。
import validator と import formatter で 2 つのモジュールを読み込み、それぞれの関数を組み合わせて 1 つの処理を作る。この記事では モジュール・パッケージ・ライブラリ の階層、import 文で別ファイルの関数を呼び出す書き方、import 時にファイル全体が実行されるしくみ、__name__ == "__main__" で直接実行とインポートを区別するパターン、そして複数の自作モジュールを役割ごとに分割して組み合わせる構成を学びました。次の記事では __init__.py を扱います。
理解度チェック
まずは1問ずつ答えてみましょう。
Q2math_utility.py の中に print("hello") をトップレベルで書いておきました。別のファイルから import math_utility を実行すると、画面には何が表示されますか?
Q3次のコードを 直接実行 したときと、別のファイルから import したとき の挙動として正しい組み合わせはどれですか?if __name__ == "__main__":
print("hello")