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