ホームページ > バックエンド開発 > Python チュートリアル > Python での循環インポートを回避および解決するにはどうすればよいですか?

Python での循環インポートを回避および解決するにはどうすればよいですか?

Barbara Streisand
リリース: 2024-12-27 21:05:10
オリジナル
567 人が閲覧しました

How Can Circular Imports in Python Be Avoided and Resolved?

Python の循環インポート: 落とし穴と解決策

Python プログラミングの領域では、モジュールが相互にインポートしようとすると循環依存関係が発生する可能性があります。このようなインポートの動作を理解することは、潜在的な落とし穴を避けるために非常に重要です。

2 つのモジュール (foo と bar など) が import foo と import bar を使用して相互にインポートする場合、両方のモジュールが完全にロードされているため、インポートはシームレスに成功します。

ただし、from foo import abc や from bar import xyz などの from import を使用する場合には問題が発生します。これらのシナリオでは、各モジュールは続行する前に他のモジュールをインポートする必要があります。この循環依存関係により、インポート エラーが発生します。

例として、次のコードを考えてみます。

# foo.py
from bar import xyz

def abc():
    print(xyz.__name__)

# bar.py
from foo import abc

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

foo は、実行する前に bar をインポートする必要があるため、このコードは ImportError をトリガーします。 import ステートメントからですが、bar では最初に foo をインポートする必要もあります。

循環インポートを効果的に処理するには、いくつかの解決策があります。存在します:

  • モジュールの先頭;いいえ、から。 Python 2 のみ:

    # foo.py
    import bar
    
    def abc():
      print(bar.xyz.__name__)
    
    # bar.py
    import foo
    
    def xyz():
      print(foo.abc.__name__)
    ログイン後にコピー
  • モジュールの先頭。 OKから;比較的大丈夫です。 Python 3 のみ:

    # foo.py
    from . import bar
    
    def abc():
      print(bar.xyz.__name__)
    
    # bar.py
    from . import foo
    
    def xyz():
      print(abc.__name__)
    ログイン後にコピー
  • モジュールの先頭。いいえ、から。相対関係なし:

    # foo.py
    import lib.bar
    
    def abc():
      print(lib.bar.xyz.__name__)
    
    # bar.py
    import lib.foo
    
    def xyz():
      print(lib.foo.abc.__name__)
    ログイン後にコピー
  • モジュールの底部。モジュールではなく属性をインポートします。 OK から:

    # foo.py
    def abc():
      print(xyz.__name__)
    
    from .bar import xyz
    
    # bar.py
    def xyz():
      print(abc.__name__)
    
    from .foo import abc
    ログイン後にコピー
  • 関数の先頭; from ok:

    # foo.py
    def abc():
      from . import bar
      print(bar.xyz.__name__)
    
    # bar.py
    def xyz():
      from . import foo
      print(foo.abc.__name__)
    ログイン後にコピー

ただし、スターのインポートについては、元の記事で提供されている例では説明されていません。

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

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