Programmingバックエンド開発者

Pythonでモジュールをインポートするときに何が起こるか説明してください。Pythonはどのようにモジュールを検索してロードしますか?インポートの不適切な構成によってコミットされる典型的なエラーは何ですか?

Hintsage AIアシスタントで面接を突破

回答。

Pythonでモジュールをインポートするとき、インタープリターはsys.pathにリストされているディレクトリを検索します。最初に標準モジュールの中から、次に.py.pycファイルおよび__init__.pyファイルを含むディレクトリ(パッケージ)の中から探します。

  1. モジュールがすでにインポートされている場合、再インポートはsys.modulesから取得します。
  2. 標準パスでモジュールが見つからない場合、ModuleNotFoundErrorがスローされます。
  3. インポート時、モジュールはバイトコード(.pyc)に変換され、キャッシュされます(書き込み権限があれば)。

例:

# mypkg/__init__.py(空であってもよい) # mypkg/mod.py # main.py import mypkg.mod
  • ファイル名、ディレクトリ構造、__init__.pyの有無(Python <3.3では必須)— すべてが重要です。

検索の仕組み:

  • まず絶対インポート。
  • 次にsys.pathディレクトリを検索します(常に現在のスクリプトのディレクトリが最初に来ます)。
  • パッケージ内ではコンテキストが重要です(from . import ...、絶対/相対インポート)。

ひねりのある質問。

スクリプトのあるディレクトリにrandom.pyという名前のファイルがあり、標準モジュールrandomをインポートしようとするとどうなりますか?

回答:

私のローカルファイルrandom.pyがインポートされ、標準ライブラリはインポートされません。モジュール名の衝突(シャドウイング)は、難解なバグの一般的な原因です。ファイル名には注意が必要です。

このテーマの詳細を知らなかったために発生した実際のエラーの例。


ストーリー

大規模なプロジェクトで、モジュールemail.pyが標準ライブラリのemailモジュールを偶然シャドウイングし、開発者は外部ライブラリのメール解析機能が動作しない理由を理解できずに長い間悩まされました。


ストーリー

MLプロジェクトで、os.path関数が動作しませんでした。メインスクリプトの近くにos.pyというファイルがあり、標準モジュールへのすべての呼び出しをキャッチしていました。名前の衝突が見つかるまで、デバッグに1か月かかりました。


ストーリー

マイクロサービスのREST APIでは、複数のサブパッケージ間でモデルの相対インポートを試みると循環インポートが発生しました。プロジェクト構造のリファクタリングとモジュールの明示的なロード順序後にのみ問題が解決されました。