この記事は、Python の import と __import__() の違いを比較したものです。一定の参考値があります。困っている友人は参考にしてください。お役に立てれば幸いです。
まず、この 2 つの違いについて説明します。
インポート命令は 2 つのことを行います: 1) モジュールの検索、2) ローカル変数へのバインド
組み込みfunction_ _import__() は 1 つのことだけを行います。モジュールの検索です。
インポート命令の実行中に、__import__() が呼び出され、モジュールの取得が完了します。
モジュールの検索プロセス:
検索プロセスを理解する前に、まず内部実装におけるいくつかの役割を理解しましょう:
a) 検索されたモジュールは、モジュール キャッシュ (sys.modules)。
b) finders | importers: モジュールがどこにあるかを検索するために使用され、モジュールが見つかった後、モジュール仕様が返されます (モジュールがどこにあるか、モジュールをロードするためにどのローダーを使用する必要があるかなどの情報が含まれます)。 。
ファインダーはビルドイン モジュールから見つかり、インポーターは他の場所から見つかります。
インポーターは拡張可能で、ファイル システム内の特定のパス、zip、および URL をサポートできます。
c) ローダー: modulespec に従ってロードして、Python でモジュールを生成します。
module = modulespec.loader.load_module(modulespec.name)
検索プロセスは次のとおりです。
1) 検索するモジュールの名前がキャッシュ (sys.modules) にある場合は、次の操作を実行します。
1.1) 値が None の場合、ModuleNotFoundError をスローします。
1.2) 値が None ではないので、値を直接返します。
2) ファインダーを使用します。インポーターで見つからない場合、組み込みモジュールから検索する 探したときにインポーターが見つからず、モジュール名がキャッシュされ、値が None の場合、ModuleNotFoundError が発生します。
インポーターを使用して検索する場合、.pyc が見つかった場合は、まず .pyc が最新かどうかを確認する必要があります。
それを見つけたら、モジュール仕様の生成と作成に戻ります
3) モジュール仕様のローダーがモジュールをロードして実行します:
module = modulespec.loader.load_module(modulespec.name) sys.modules[modulespec.name] = module modulespec.loader.exec_module(module)
4) 最後に、見つからない場合は、モジュール名をキャッシュに記録し、値は None にして、ModuleNotFoundError
以上がPython の import と __import__() の違いの比較の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。