Guido 自身がリバース ドメイン規則に従うべきだと発表した場合import
、Python の実装に大幅な変更がない限り、それは採用されないでしょう。
考慮してください: Python は実行時にフェイルファスト アルゴリズムを使用してインポート パスを検索します。java は、コンパイル時と実行時の両方で徹底的なアルゴリズムを使用してパスを検索します。次のようにディレクトリを配置してみてください。
folder_on_path/
com/
__init__.py
domain1/
module.py
__init__.py
other_folder_on_path/
com/
__init__.py
domain2/
module.py
__init__.py
次に試してください:
from com.domain1 import module
from com.domain2 import module
これらのステートメントの 1 つだけが成功します。なんで?どちらかfolder_on_path
またはどちらかother_folder_on_path
が検索パスの上位にくるからです。python は、取得できるfrom com.
最初のcom
パッケージを取得したことを確認します。たまたま が含まれている場合domain1
は、最初のものimport
が成功します。そうでない場合は、をスローしImportError
てあきらめます。なんで?import
実行時に発生する必要があるため、コードの流れの任意の時点で発生する可能性があります (ただし、ほとんどの場合は最初です)。一致する可能性がないことを確認するために、その時点で徹底的なツリー ウォークを行う必要はありません。com
という名前のパッケージが見つかった場合、それがその パッケージであると想定しcom
ます。
さらに、python は次のステートメントを区別しません。
from com import domain1
from com.domain1 import module
from com.domain1.module import variable
それを検証する概念はcom
、ケース com
ごとに異なります。Java では、実際には 2 番目のケースのみを処理する必要があり、それはファイル システムをウォークスルーすることで実現できます (クラスとファイルに同じ名前を付ける利点があると思います)。Python では、ファイル システムの支援だけでインポートを実行しようとすると、最初のケースは (ほぼ) 透過的に同じになり ( init .py は実行されません)、2 番目のケースは実行できますが、最初のファイルは失われます。 module.py を実行していますが、3 番目のケースはまったく達成できません。コードを使用可能にするには、実行するvariable
必要があります。これはもう 1 つの要点import
です。名前空間を解決するだけでなく、コードを実行します。
これまでに配布されたすべての python パッケージで、フォルダー、次に などを検索するインストール プロセスが必要な場合は、これを回避できますが、これによりパッケージ化がかなり難しくなり、ドラッグ アンド ドロップ機能が破壊されます。そして、パッケージングと全面的な迷惑になります。com
domain