2016-09-06 7 views
1

Pythonで循環インポートを防ぐ方法については、this postを読んでいます。私はポストに主張を理解していない:輸入対輸入輸入対輸入?

import package.a # Absolute import and 
import a # Implicit relative import (deprecated, py2 only) 

円形輸入を避けるが、

from ... import ... 
#or 
import ... as .. 

ことはできません(Pythonの2.xの上で)することができます。

これの背後にある理由は誰にも分かりますか?

答えて

0

検索した後、私は自分自身で答えを見つけます。

本来、循環インポートはfrom … import …の問題です。インポートされたモジュールは、モジュールコードの実行後にのみ返されるためです。

説明するために、a.pyをb.pyにインポートし、a.pyにbをインポートしたとします。 import aimport bについては、sys.modulesを参照して/ bを探し、新しいモジュールを入れて返すだけです。一方、b.pyでfrom a import cは、我々がa.pyから開始このようなコード(a.pyでfrom b import dための同様の擬似パイソン)

if 'a' not in sys.modules: 
    sys.modules[a] = (A new empty module object) 
    run every line of code in a.py 
    add the module a to its parent's namespace 
return module 'a' 

を有し、Bの空のモジュールを置きますsys.modulesに渡し、b.pyの実行を開始し、aをsys.modulesに入れてa.pyを実行します。次にそれはfrom b import dに再び行き、sys.modulesの中のbを見つけますが、それは空ですが、エラーをスローします:no属性d。

PS1:参照先が間違っています。 import ... as ...は循環インポートに適しています。

PS2:from a import cは、Python 3でa.cをインポートするのと同じです。