Python 2.7 は、パッケージ内でのインポートの内部を見ると、非常に奇妙なことを行います。基本的に、私が本当に理解できない理由で、ビルトインの相対的なインポートを(とりわけ)保存しています。最小限のユースケースを以下に示します。
次の形式のディレクトリ構造を想定します。
\BaseFolder
* __init__.py
* MainFile.py
\TestFolder
* __init__.py
* TestModule.py
両方の __init__.py が空です。MainFile.py には次のように書かれています:
import TestFolder.TestModule
import sys
for x in sorted(sys.modules.keys()):
print x
TestModule.py は次のように述べています。
import os
Python で MainFile.py を実行すると、インポートされたモジュールのリストが表示されます。モジュールのキーを調べると、がらくたがたくさんありますが、次のキーを見つけることができます。
TestFolder
TestFolder.TestModule
TestFolder.os
...
os
これらのモジュールの値を見ると、TestFolder.os は None です。しかし、そもそもなぜ存在するのでしょうか?探したときに存在しないことが示されたモジュールが、モジュール リストに登録されるのはなぜですか? これは、システムが最初に TestFolder (したがって TestFolder.os) で「os」ライブラリをチェックし、次に組み込みを検索するために発生すると想定しています。チェックしたからといって、なぜエントリを追加するのですか?なぜPythonがこれを行うのかについて洞察を持っている人はいますか? たぶん、それらの場所にあるライブラリを二度とチェックしないようにするためですか?