ホームページ > バックエンド開発 > Python チュートリアル > Pythonの相対インポートと絶対インポートについて詳しく解説

Pythonの相対インポートと絶対インポートについて詳しく解説

高洛峰
リリース: 2017-01-09 11:44:10
オリジナル
1602 人が閲覧しました

前書き

Python の相対インポートと絶対インポート、これら 2 つの概念は、パッケージ内のインポートに対する相対的なものです。パッケージ内インポートとは、パッケージ内のモジュールがパッケージ内のモジュールをインポートすることを意味します。

Python importのパスを検索

カレントディレクトリ内のモジュールを検索

環境変数PYTHONPATHに指定されたパスリストを順に検索

Pythonのインストールパスのlibライブラリを検索

Pythonの手順import

ロードされたPythonのすべてのモジュール情報はsys.modules構造体に格納されます。 モジュールをインポートする場合、次の手順が実行されます。

Aをインポートする場合は、sys.modulesにすでにAがあるかどうかを確認します。存在する場合はロードされません。存在しない場合は、A のモジュール オブジェクトを作成して A をロードします

それが A から B をインポートした場合は、まず A のモジュール オブジェクトを作成し、次に A を解析し、そこから B を見つけて、それを A の __dict__ に入力します

相対インポートと絶対インポート

絶対インポート形式は import A.B または from A import B で、相対インポート形式は from インポート B または from ..A import B. を表します。現在のモジュール、.. は上位レベルのモジュールを表し、... は上位レベルのモジュールを表します。

相対インポートにより、ハードコーディングによって引き起こされるメンテナンスの問題を回避できます。たとえば、トップレベルのパッケージの名前を変更すると、そのサブパッケージのすべてのインポートが使用できなくなります。ただし、相対インポート ステートメントを含むモジュールは直接実行できません。そうでない場合は、例外が発生します。

ValueError: Attempted relative import in non-package
ログイン後にコピー

これの理由は何ですか?モジュールをインポートするときは、最初にいくつかのルールを理解する必要があります:

パッケージ構造が明示的に指定されていない場合、Python は __name__ に基づいてパッケージ内のモジュールの構造を決定します。パッケージ構造ではありません。A.B.C 構造の場合、最上位モジュールは A です。基本的に次の原則に従います:

それが絶対インポートの場合、モジュールはそれ自身のサブモジュール、またはその最上位モジュールと同じレベルのモジュールとサブモジュールのみをインポートできます

それが相対インポートの場合、モジュールはパッケージ構造 そして、最上位モジュール内のモジュールのみをインポートできます

モジュールが直接実行される場合、それ自体が最上位モジュールであり、階層がないため、他の相対パスは見つかりません。

Python2.x のデフォルトは相対パス インポート、Python3.x のデフォルトは絶対パス インポートです。絶対インポートでは、サブパッケージのインポートによる標準ライブラリ モジュールの上書き (同じ名前による競合) を回避できます。 Python2 でデフォルトで絶対インポートを使用する場合 (暗黙的な相対インポート)、明示的な相対インポート (表示相対インポート) は無効になりません。

それでは、暗黙的な相対インポートとは何であり、明示的な相対インポートとは何でしょうか?次のパッケージ構造を仮定して、例を見てみましょう:

from __future__ import absolute_import
ログイン後にコピー

次に、ツールでベンチを参照する場合、いくつかの方法があります:

thing
├── books
│ ├── adventure.py
│ ├── history.py
│ ├── horror.py
│ ├── __init__.py
│ └── lovestory.py
├── furniture
│ ├── armchair.py
│ ├── bench.py
│ ├── __init__.py
│ ├── screen.py
│ └── stool.py
└── __init__.py
ログイン後にコピー

暗黙的な相対とは、インタプリタに相対的なものではなく、デフォルトの相対的なものを通知することを意味します。現在のモジュールに対して相対的であり、明示的相対的には、インポートする対象をインタープリタに明示的に指示します。上記の 3 番目のインポート方法は公式によって推奨されていません。この方法は、Python3 ではパス内のモジュールをインポートするためにのみ使用できます。

相対インポートと絶対インポートはパッケージ内インポートのみに適用されます

最後に、相対インポートと絶対インポートはパッケージ内インポートにのみ適用されることを再度強調します。そうしないと、この記事で説明する内容は無意味になります。いわゆるパッケージは、__init__.py ファイルが含まれるディレクトリです。このファイルは、パッケージが空の場合もあれば、任意の正規の Python コードを追加する場合にも実行されます。

相対インポートはハードコーディングを回避でき、パッケージのメンテナンスに適しています。絶対インポートにより、標準ライブラリとの名前の競合を回避できます。実際、カスタム モジュールに標準ライブラリと同じコマンドを含めることは推奨されません。

前述したように、相対インポートを含むモジュールは直接実行できません。実際には、ImportError:

import bench     # 此为 implicit relative import
from . import bench   # 此为 explicit relative import
from furniture import bench # 此为 absolute import
ログイン後にコピー
これは絶対インポートの場合と同じ理由です。絶対インポートと相対インポートを含むパッケージ内のモジュールを実行するには、 python -m A.B.C を使用してモジュール階層をインタープリターに伝えることができます。

同じディレクトリに 2 つのモジュール a.py と b.py が配置されている場合、なぜ a.py に a をインポートできるのかと疑問に思う人もいるかもしれません。

これは、これら 2 つのファイルが配置されているディレクトリがパッケージではないためです。そのため、各 Python ファイルは、他のモジュールによって直接インポートできる独立したモジュールです。標準ライブラリをインポートするのと同じように、相対的なインポートがなく、絶対インポートの問題。相対インポートと絶対インポートはパッケージ内でのみ使用されます。

概要

上記がこの記事の全内容です。この記事の内容が Python の学習または使用に役立つことを願っています。ご質問がある場合は、メッセージを残してください。

Python の相対インポートと絶対インポートに関する詳細な記事については、PHP 中国語 Web サイトに注目してください。

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート