ホームページ > バックエンド開発 > Python チュートリアル > Python での循環インポートはどのように解決して回避できますか?

Python での循環インポートはどのように解決して回避できますか?

Barbara Streisand
リリース: 2024-12-18 03:03:11
オリジナル
248 人が閲覧しました

How Can Circular Imports in Python Be Resolved and Avoided?

Python での循環インポート

循環インポートは、複数のモジュールが相互にインポートを試み、循環依存関係を形成するときに発生します。循環インポートの動作を理解することは、Python プログラマーにとって非常に重要です。

循環インポートの影響

2 つのモジュールが相互に直接インポートする場合 (bar.py の import foo など) foo.py にインポートバーがある場合、インポートは問題なく成功します。ただし、循環インポート内で特定の属性またはサブモジュールをインポートしようとすると、問題が発生します。

次のシナリオを考えてみましょう:

# module foo.py
from bar import xyz

# module bar.py
from foo import abc
ログイン後にコピー

この場合、各モジュールは、前に他のモジュールをインポートする必要があります。特定の属性またはサブモジュールにアクセスできます。 Python はサイクル内でどのモジュールを最初にインポートする必要があるかを判断できないため、これによりインポート エラーが発生します。

Python での循環インポートの作業

潜在的な問題にもかかわらず、循環インポートでエラーが発生しない可能性がある特定のシナリオ:

  • Importingファイルの先頭にあるモジュール: 特定の属性やサブモジュールを使用せずに両方のモジュールをトップレベルでインポートすると、Python 2 と Python 3 の両方で機能します。
  • インポート元from を使用した関数内: 特定の属性またはサブモジュールが from を使用して関数内からインポートされた場合、Python 2 と Python の両方で機能します。 3.
  • モジュールではなくパッケージ属性のインポート: bar をインポートする代わりに、from bar import xyz を使用して特定の属性 xyz が bar パッケージからインポートされる場合でも、循環インポートは機能する可能性があります。

次の Python コードは、さまざまなシナリオで循環インポートが機能することを示しています。

例 1 (Python 3 のみ)

# lib/foo.py
from . import bar

def abc():
    print(bar.xyz.__name__)

# lib/bar.py
from . import foo

def xyz():
    print(foo.abc.__name__)
ログイン後にコピー

例 2 (Python 2 のみ)

# lib/foo.py
import bar

def abc():
    print(bar.xyz.__name__)

# lib/bar.py
import foo

def xyz():
    print(foo.abc.__name__)
ログイン後にコピー

例3

# lib/foo.py
from lib.bar import xyz

# lib/bar.py
from lib.foo import abc
ログイン後にコピー

結論

循環インポートはエラーを引き起こす可能性がありますが、Python がそれらを処理することが不可欠です。上記のガイドラインに従うことで、プログラマーはインポート エラーを回避し、Python プログラムの正しい動作を保証できます。

以上がPython での循環インポートはどのように解決して回避できますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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