ホームページ  >  記事  >  バックエンド開発  >  Python の import と __import__() の違いの比較

Python の import と __import__() の違いの比較

不言
不言オリジナル
2018-09-20 16:09:462993ブラウズ

この記事は、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 サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。