Pythonでどのように循環インポートが処理されるのか疑問に思っています。私は最小限の質問を掘り下げようとしましたが、私はこの正確な変種が以前に尋ねられたとは思いません。私はlib.foo
とlib.bar
間の循環依存を持っている場合基本的に、私はPythonの "import lib.foo"と "import lib.foo f"の相違点
import lib.foo
と
import lib.foo as f
の違いを見ています。私は両方とも同じように動作することを期待していました。(おそらく半初期化された)モジュールはsys.modules
にあり、ローカルの名前空間に入れられます。 (テストから、私はimport lib.foo
が本当にローカル名前空間にlib
を置くことに気づいた - 。私はとにかくlib.foo.something
をやるという構文で、大丈夫)
しかし、lib.foo
はsys.modules
にすでに存在する場合は、import lib.foo as f
は属性としてfoo
にアクセスしようとしますlib
にあり、AttributeErrorが発生します。なぜその動作は(一見)sys.modules
の存在に依存していますか?
また、この動作は文書化されていますか?私はPython import
statement referenceがこの動作を説明していると感じていない、または少なくとも私はそれを抽出できませんでした:-)
まったく私はoft recommendedスタイルを使用するようにコードベースを変更しようとしています。モジュールでない記号:
from project.package import moduleA
from project.package import moduleB
しかし、それは二つのモジュール間の循環輸入品がある場合に失敗します。私は、2つのモジュールのトップレベルの定義がお互いに依存しない限り(例えば、moduleB
にはサブクラスがなく、moduleA
に基底クラスを持つ)、それが動作することを期待していました。
テストスクリプト:
#!/bin/sh
rm -r lib; mkdir lib
touch lib/__init__.py
cat > lib/foo.py <<EOF
# lib.foo module
print '{ foo'
#import lib.bar # works
import lib.bar as b # also works
#from lib import bar # also works
print 'foo }'
EOF
cat > lib/bar.py <<EOF
# lib.bar module
print '{ bar'
#import lib.foo # works
import lib.foo as f # AttributeError: 'module' object has no attribute 'foo'
#from lib import foo # ImportError: cannot import name foo
print 'bar }'
EOF
python -c 'import lib.foo'
http://google-styleguide.googlecode.com/svn/trunk/pyguide.html?showone=Imports#Importsが破損しています - 読んでいただければ幸いです –