2017-06-05 1 views
-1

循環インポートを回避するには、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' 
+0

*「Pythonでのベストプラクティスは、」* - つもりは引用を必要とします。 –

+0

@ PeterWood done –

+1

これはベストプラクティスではなく、循環インポートを回避する方法です。循環輸入を避ける最善の方法は、輸入を行わないことです。依存関係を適切に整理し、モジュールの責任を減らし、コンクリート型の抽象構文を使用するなど –

答えて

0

: これは私が手トレースは(私はそれが私が与えることができる任意の解明より明確になると思う)です

import a.b.c.d.e as E 

あなたが投稿したコードは、同様に動作しますが、それはのようにきれいではありません。

import a.b.c.d.e 
E = a.b.c.d.e 
+0

動作しません:循環インポートの問題のために、 'a'は属性' b'をまだ持っていません(またはサブモジュールの1つ...) –

+1

@ hl037_あなたはあなたの輸入をしていますか?あなたの質問は、高価な名前の検索を避ける方法を尋ねることであり、失敗したインポートについては言及していません。 –

+0

すべてのコードが非常に巨大な 'a'モジュールの最初のものであり、それを維持するのが地獄なので、それはサブモジュールに分割されていたとします。しかし、 'abcdf'のいくつかの関数は' a'の関数を呼びますが、 'a'の中には' abcdf'の中に何らかのものが必要なものがありますので、 'a'では' abcdf'をインポートし、 'abcdf'には'import a' –

関連する問題