1. ホーム
  2. python

[解決済み] __init__.py へのコードの追加

2023-02-23 19:17:27

質問

django のモデルシステムがどのように動作するか見ているのですが、 理解できないことに気づきました。

私は、空の __init__.py ファイルを作成して、カレントディレクトリがパッケージであることを指定することは知っています。 そして、ある変数を __init__.py に何らかの変数を設定することで、import * が正しく動作するようになります。

しかし、django は from ... import ... ステートメントを大量に追加し、クラスの一団を __init__.py . なぜでしょう? これでは、見た目が乱雑になるだけではありませんか? の中にこのコードが必要な理由があるのでしょうか? __init__.py ?

どのように解決するのですか?

のすべてのインポートは __init__.py は、それを含むパッケージ(ディレクトリ)をインポートすると利用できるようになります。

./dir/__init__.py :

import something

./test.py :

import dir
# can now use dir.something

EDIT: 言い忘れていましたが、このコードは __init__.py のコードは、そのディレクトリからモジュールをインポートしたときに初めて実行されます。ですから、通常パッケージレベルの初期化コードを置くには良い場所です。

EDIT2: dgrant が私の例の混乱の可能性を指摘してくれました。この例では __init__.py import something は、パッケージからでなくても、任意のモジュールをインポートすることができます。例えば、次のように置き換えることができます。 import datetime と置き換えることができ、トップレベルでは test.py の両方が動作します。

import dir
print dir.datetime.datetime.now()

import dir.some_module_in_dir
print dir.datetime.datetime.now()

要するに __init__.py で割り当てられたすべての名前は、インポートされたモジュール、関数、クラスであっても、パッケージやパッケージ内のモジュールをインポートするたびに、パッケージの名前空間で自動的に利用できるようになります。