259
168

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

__init__.py を省略してはいけない

Last updated at Posted at 2020-01-20

Python 3.3 から __init__.py を省略して良いと思っている人が多いですが、 省略しないでください。

なぜ勘違いが起こったのか

Python 3.3 から、 PEP 420 で Implicit namespace package が追加されました。

Namespace package とは普通の package ではありません。 特殊な用途のもので、ほとんどの人にとっては 知る必要すらない ものです。

どうしても知りたければ、上の PEP 420 と packaging guide を読んでください。

__init__.py を省略する弊害

普通の package で Implicit namespace package を乱用すると弊害があります。

import が遅くなる

通常の package とは違うので import が package 内のモジュールを探すのが遅くなる可能性があります。
また、確率は低いですがその探索順序の違いによってなにか問題が起こる可能性もあります。

ツールが対応していない

例えば標準ライブラリの unittest で test モジュールを自動で探す機能は __init__.py がないディレクトリの中を探しに行きません。 (https://bugs.python.org/issue29642 を参照)

もし対応しようとしたら、 __init__.py がないディレクトリも全部再帰的に探索しないといけなくなります。そのディレクトリは node_modules で数十万のファイルやディレクトリが入っているかもしれません。そのディレクトリがネットワークマウントされていたりしたらどれだけ遅くなるでしょうか。

Implicit namespace package を通常の package として 乱用するユーザーのためにそんな速度低下は到底受け入れられません。

同じ理由で lint 等のツールでも、自動でパッケージやモジュールを探すような機能が Implicit namespace package を探してくれると期待してはいけません。

背景を知らずに要望を受け入れて対応しているツールもあるかもしれませんが、「対応すべき」「対応しろ」というIssueやPull Requestを送るのはメンテナや他のユーザーに迷惑なのでやめましょう。

259
168
1

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
259
168

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?