プロジェクトの__init__.py
ファイルの使用シナリオまたは設計目標を理解するのが困難です。
次のファイルを含む「モデル」ディレクトリ(パッケージと呼ばれる)があると仮定します
__init__.py
meta.py
solrmodel.py
mongomodel.py
samodel.py
__init__.py
を使用する2つの方法を見つけました。
solrmodel.py
、mongomodel.py
、samodel.py
で使用する必要がある共通の定義があります。すべての* model.pyクラスのベース/共通定義として__init__.py
を使用できますか?これは、model/__init__.py
をインポートする必要があることを意味します。
または、__init__.py
にはsolrmodel.py、mongomodel.py、samodel.pyの定義が独自にインポートされており、次のようなクラスまたは関数を簡単にインポートできます。
# file: __init__.py
from mongomodel import *
from solrmodel import *
from samodel import *
(import *
は推奨されておらず、単に慣例として使用していることを認識しています)
上記の2つのシナリオを決定できませんでした。 __init__.py
の使用シナリオは他にもありますか。使用方法を説明できますか?
__init__.py
多くのパッケージには初期化するものがないため、私が書いたファイルは空です。
初期化が必要な場合の1つの例は、パッケージのロード時に一度に大量のデータを(ファイル、DB、またはWebなどから)一度に読み取りたい場合です-その場合ははるかパッケージの__init__.py
個別の「初期化モジュール」を持ち、パッケージ内のすべての実際のモジュールからそのモジュールを冗長にインポートするのではなく(無駄に繰り返し、エラーが発生しやすい:パッケージの__init__.py
isは、パッケージ内のモジュールが明らかにPythonicになる前に一度ロードされます!)。
他の具体的かつ信頼できる意見表明については、Pythonの標準ライブラリの一部であるさまざまなパッケージで採用されているさまざまなアプローチを参照してください。
パッケージ内のモジュールをインポートすると、__init__.py
の内容がインポートされます。
3番目のシナリオを見落としています。これは、共通部分を別のモジュールに入れてから、他のモジュールにそれをインポートさせて、パッケージ外で使用されるものに__init__.py
を残すことです。これは私が通常従う慣行です。