2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

【Python】__init__.py でできる便利テクニックの宝庫

2
Posted at

はじめに

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 必要に応じて使い分けられる

2
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
2
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?