web-dev-qa-db-ja.com

__init__.pyを使用

プロジェクトの__init__.pyファイルの使用シナリオまたは設計目標を理解するのが困難です。

次のファイルを含む「モデル」ディレクトリ(パッケージと呼ばれる)があると仮定します

  1. __init__.py
  2. meta.py
  3. solrmodel.py
  4. mongomodel.py
  5. samodel.py

__init__.pyを使用する2つの方法を見つけました。

  1. solrmodel.pymongomodel.pysamodel.pyで使用する必要がある共通の定義があります。すべての* model.pyクラスのベース/共通定義として__init__.pyを使用できますか?これは、model/__init__.pyをインポートする必要があることを意味します。

  2. または、__init__.pyにはsolrmodel.py、mongomodel.py、samodel.pyの定義が独自にインポートされており、次のようなクラスまたは関数を簡単にインポートできます。

    # file: __init__.py
    
    from mongomodel import *
    from solrmodel import *
    from samodel import *
    

    import *は推奨されておらず、単に慣例として使用していることを認識しています)

上記の2つのシナリオを決定できませんでした。 __init__.pyの使用シナリオは他にもありますか。使用方法を説明できますか?

64
user90150

__init__.py多くのパッケージには初期化するものがないため、私が書いたファイルは空です。

初期化が必要な場合の1つの例は、パッケージのロード時に一度に大量のデータを(ファイル、DB、またはWebなどから)一度に読み取りたい場合です-その場合ははるかパッケージの__init__.py個別の「初期化モジュール」を持ち、パッケージ内のすべての実際のモジュールからそのモジュールを冗長にインポートするのではなく(無駄に繰り返し、エラーが発生しやすい:パッケージの__init__.pyisは、パッケージ内のモジュールが明らかにPythonicになる前に一度ロードされます!)。

他の具体的かつ信頼できる意見表明については、Pythonの標準ライブラリの一部であるさまざまなパッケージで採用されているさまざまなアプローチを参照してください。

49
Alex Martelli

パッケージ内のモジュールをインポートすると、__init__.pyの内容がインポートされます。

3番目のシナリオを見落としています。これは、共通部分を別のモジュールに入れてから、他のモジュールにそれをインポートさせて、パッケージ外で使用されるものに__init__.pyを残すことです。これは私が通常従う慣行です。