1

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がこれを行うのかについて洞察を持っている人はいますか? たぶん、それらの場所にあるライブラリを二度とチェックしないようにするためですか?

4

1 に答える 1

1

キャッシュには、ヒットだけでなくミスも含まれます。TestFolder.os==None は、python が「os」というパッケージ関連モジュールを探したが、見つからず、次の行に進んだことを意味します。パッケージの絶対名「TestFolder.os」をキャッシュします。これは、他のモジュールがそれを呼び出すためです。値を None に設定して、他のモジュールのインポートでファイル システムを再度チェックする必要がないようにします。

于 2013-05-15T16:50:01.813 に答える