__init__.py
別名: パッケージ初期化ファイル / dunder init
Python でディレクトリを通常のパッケージとして扱わせるためのファイル。
パッケージを import したときに暗黙に実行され、空でもよい。
無いディレクトリは名前空間パッケージとして扱われる。
公開:
定義
__init__.py は、Python にディレクトリを通常のパッケージ(regular package)として認識させるためのファイルである。
パッケージを import すると、そのディレクトリの __init__.py が暗黙に実行され、中で定義した名前がパッケージの名前空間に入る。
中身は空でもよい。
詳細
import parent.one を実行すると、parent/__init__.py と parent/one/__init__.py が順に実行される。
初期化処理を書いたり、from package import * で読み込む名前を __all__ に並べたりする場所としても使われる。
Python 3.3 で PEP 420 が入ってからは、__init__.py の無いディレクトリも名前空間パッケージとして import できる。
ただし扱いは通常のパッケージと同じではない。
たとえば pytest の既定の import 方式は、__init__.py の無いディレクトリのテストファイルをファイル名だけのモジュール名で読み込むため、別のディレクトリに同名のファイルがあると 「import file mismatch」で収集が止まる。
よくある誤解
- Python 3 では不要になった: 名前空間パッケージとしては import できるが、パッケージの初期化処理は書けず、ツールによって扱いが変わる。
自分のコードをパッケージとして扱わせたいなら置くのが確実である。 - 置けば相対 import が通る: 相対 import はモジュールがパッケージの一部として読み込まれたときだけ動く。
ファイルを直接python file.pyで実行すると、__init__.pyがあっても親パッケージは分からない。
関連
パッケージが見つかるかどうかは、モジュール検索パスの先頭に何が入っているかで決まる。
仮想環境を使う場合は venv も合わせて確認する。