循環インポートを回避するには、import x
を使用して、毎回x.func
を使用します。 (Circular (or cyclic) imports in Python参照)。円形のインポートの問題を避けるために、完全修飾名でPythonの検索オーバーヘッドを回避する方法
しかし、x
が例えばa.b.c.d.e
の場合、特に、関数が繰り返し呼び出された場合には、無視できないオーバーヘッド(可読性の問題に加えて)が発生します。インポートが解決されたときにE = a.b.c.d.e
のようなショートカットを定義するメカニズムがあるかどうかを知りたいですか? (またはルックアップeachtimeを避けるために何か)
注:pypyに、パフォーマンス上の違いはありませんが、CPythonの上で、あなたはimport ... as ...
ソリューションについて×2改善
a.A()
間とa.b.c.d.e.f.g.h.A()
EDIT を得ることができ、モジュールをインポートするときは、別名を設定することができます
File "MyApp/__init__.py", line 3, in <module>
import MyApp.core
File "MyApp/core.py", line 3, in <module>
import MyApp.formatters.ASCIIFormatter as _F
File "MyApp/formatters/__init__.py", line 2, in <module>
import MyApp.formatters.ASCIIFormatter as ASCIIFormatter
File "MyApp/formatters/ASCIIFormatter.py", line 2, in <module>
import MyApp.core as _C
AttributeError: module 'MyApp' has no attribute 'core'
*「Pythonでのベストプラクティスは、」* - つもりは引用を必要とします。 –
@ PeterWood done –
これはベストプラクティスではなく、循環インポートを回避する方法です。循環輸入を避ける最善の方法は、輸入を行わないことです。依存関係を適切に整理し、モジュールの責任を減らし、コンクリート型の抽象構文を使用するなど –