はじめに
Python のパッケージには必ず置かれる __init__.py。
「ここはパッケージですよ」という印に見えますが、実は 便利テクニックの宝庫 です。
この記事では、__init__.py を使ってできる実用的なワザをまとめて紹介します。
1. __init__.py は実行される「初期化ポイント」
__init__.py は パッケージが import された瞬間 に実行されます。
# __init__.py
print("mypkg loaded")
import mypkg すると、この print が走ります。
用途としては:
- 設定ファイルの読み込み
- ログ初期化
- デコレータ登録
- シリアライザ登録
などが可能。
2. 便利ワザ①:よく使う関数・クラスを“直下にエクスポート”
サブモジュールにある関数をパッケージ直下で import できるようにするテクニックです。
フォルダ例:
mypkg/
__init__.py
utils.py
utils.py
def add(a, b):
return a + b
__init__.py に次を書く:
from .utils import add
すると:
from mypkg import add
と書けるようになります。
API がシンプルになり、ユーザーが使いやすいパッケージになる。
3. 便利ワザ②:__all__ で公開 API を管理
from mypkg import * の対象を明確化できます。
# __init__.py
from .utils import add
from .service import run
__all__ = ["add", "run"]
公開 / 非公開を分けることで、
ライブラリの外部 API を保護しつつ、コードを整理できます。
4. 便利ワザ③:バージョン情報をここに置く
Python ライブラリでは定番。
# __init__.py
__version__ = "1.0.0"
__author__ = "Anna"
使う側:
import mypkg
print(mypkg.__version__)
セットアップツールと同期させるプロジェクトも多いです。
5. 便利ワザ④:サブモジュールの「ショートカット import」
普通:
from mypkg.chess.board import Board
chess/__init__.py に書く:
from .board import Board
使う側:
from mypkg.chess import Board
階層の深さが減り、
ユーザー側コードがスッキリします。
6. 便利ワザ⑤:設定ファイルやリソースを読み込む
初期化ポイントとして使えるので、
設定をここで読み込む例はよくあります。
# __init__.py
import json
from pathlib import Path
config_path = Path(__file__).parent / "config.json"
config = json.loads(config_path.read_text())
パッケージ使用者は import するだけで設定を使える。
7. 便利ワザ⑥:サブパッケージを統合して “入り口” を作る
大規模プロジェクトで非常に重宝します。
構成:
mypkg/
core/
...
util/
...
service/
...
__init__.py
__init__.py:
from .core import CoreEngine
from .service import Service
from .util import helper
__all__ = ["CoreEngine", "Service", "helper"]
ユーザー側:
from mypkg import CoreEngine, Service
Facade パターンのように、パッケージの“きれいな入口”を作れます。
8. 便利ワザ⑦:フレームワークでの「自動登録ポイント」
Django、Pydantic、FastAPI などでは、
__init__.py を利用して ルーター・モデル・シリアライザをまとめて登録 するのが定石。
例:FastAPI の router まとめ
# routers/__init__.py
from .user import router as user_router
from .item import router as item_router
__all__ = ["user_router", "item_router"]
9. 「空でも良い」ことも大事な特徴
__init__.py は 空でも構わない です。
意味は:
「機能追加したいときだけ書く。
必要なければ空のままにしておけばいい。」
これが Python の柔軟性。
まとめ
| テクニック | 役割 |
|---|---|
| 初期化コード | import 時に処理を実行 |
| 再エクスポート | パッケージ直下で関数・クラスを提供 |
__all__ |
公開 API を管理 |
| バージョン情報 | 利用者が参照しやすい |
| ショートカット import | 階層を浅くし可読性向上 |
| 設定読み込み | 設定・資産の初期ロード |
| Facade 化 | パッケージの“美しい入口”を提供 |
| 空のまま OK | 必要に応じて使い分けられる |