Pythonの__init__.pyは何のため?

Flaskを学び出したとき、ディレクトリごとに “__init__.py” というファイルを置く必要がある(モジュールとして認識させるため) と技術本で読んだ記憶があるのですが、先日自分で作ったFastAPIアプリケーションを見返していると、__init__.pyを書いていたり書き忘れていたりしました(猛反省)。

にも関わらず、特にエラーが出たことはありませんし、テキストエディタで警告が出たこともありません。

「__init__.pyって実は必要なかったのか。。。??」となったので、あらためて調べてみました。

__init__.pyは無くても問題ないのか

結論から言えば、「私の記憶は間違っていない(ディレクトリを「Pythonパッケージ」として認識させる役割)」ですが、「現在は必ずしもディレクトリごとに__init__.pyが必要というわけではない」です。

現在のPythonでは、__init__.pyがなくても「namespace package」としてディレクトリを扱うことができます。

そのため、

models/ 
└ user.py

のように__init__.pyがないディレクトリでも、状況によっては普通にimportできます。

それでも__init__.pyを置くことが多い理由

多かれ少なかれ習慣的なところもあるかと思いますが、アプリケーションのディレクトリ構成を明確にする目的で置いておくことが多いです。

チーム開発のように複数人で開発する場合など、__init__.pyを配置しておくことで、「ここはパッケージとして扱うディレクトリですよ」ということが見た目にも分かりやすくなります。

init.pyには処理を書くこともできる

__init__.pyは単なる空ファイルとは限りません。

例えば、

# models/__init__.py

from .user import User 
from .product import Product

としておき、

from models import User, Product

のようにimportできます。

ただし、何でも__init__.pyに詰め込むと、逆に分かりづらくなるのでそこの判断はセンスと経験が問われるところです。

簡単なまとめ

今回あらためて調べてみて、

  • __init__.pyはPythonパッケージに関係するファイル
  • 現在のPythonでは必ずしも必要ではない
  • パッケージの構造を明示する目的でも使える
  • __init__.pyから別のモジュールをimportすることもできる

ということを確認しました。

以前は「Pythonのパッケージなら__init__.pyが必要」と覚えていましたが(忘れていましたけれど)、最近のPythonでは少し事情が違うようです。

Python