3秒でわかる
Python では1つの .py ファイルがそのままモジュールになります。処理をファイル単位で切り、import して他から再利用するための仕組みです。
もう少し詳しく
どういうものか
Python のモジュールは、関数やクラスや定数をまとめた1つの .py ファイルです。calc.py を作れば、それだけで calc というモジュールになり、他のファイルから import calc で読み込めます。標準ライブラリの math や json も、実体は同じくモジュールです。
複数のモジュールをフォルダにまとめたものはパッケージと呼びます。フォルダの中に __init__.py を置くと、from mypkg import calc のような階層的な読み込みができます。
なぜ必要か
処理を1つのファイルに書き続けると、数百行を超えたあたりで、どこに何があるか探すコストが書くコストを上回ります。モジュールに切ると、名前の衝突を避けられ、テストも切った単位で書けます。同じ関数を別のプロジェクトへ持っていくときも、ファイルごと運べば済みます。
具体例
税込価格を計算する関数を別ファイルに出して使う例です。
# price.py
TAX_RATE = 0.1
def with_tax(amount):
return int(amount * (1 + TAX_RATE))
if __name__ == "__main__":
print(with_tax(1000))# main.py
import price
from price import with_tax
print(price.TAX_RATE) # 0.1
print(with_tax(1000)) # 1100つまずきやすいところ
自作ファイルに random.py や json.py と名前を付けてしまい、標準ライブラリのほうが読み込めなくなる事故が定番です。同じ名前があると、実行したフォルダにある自作ファイルが先に見つかります。
import price した瞬間に price.py の中身が上から実行される点も見落とされがちです。ファイルの一番下に動作確認の print を書いたままにすると、import しただけで出力されます。これを防ぐのが if __name__ == "__main__": の行で、直接実行したときだけ動く区画になります。
似た用語との違い
| 用語 | 指すもの |
|---|---|
| モジュール | 1つの .py ファイル |
| パッケージ | モジュールを束ねたフォルダ |
| ライブラリ | 配布される機能のまとまり。中身はパッケージやモジュール |
pip で入れるのはライブラリで、コードの中で import するのはその中のモジュール、という関係です。