できない.dev

__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 も合わせて確認する。

この記事は役立ちましたか?