次の python パッケージを検討してください。
/pkg
/pkg/__init__.py
/pkg/a.py
/pkg/b.py
a および b モジュールは両方とも相互に依存しているため、それぞれが他方をインポートする必要があります (循環依存)。この import ステートメントを実行するには 4 つの方法があるようです。
a.pyの内部:
import b
b.pyの内部(一度にこれらの import ステートメントの 1 つだけを使用しています):
import a
import pkg.a
from pkg import a
from . import a
これらの import ステートメントはすべて、同じ import の構文的に異なるバージョンですが、すべてが同じように機能するわけではありません。pkg.aをインポートしようとすると、異なる結果が生成されます。
import a
最初のインポート スタイルはエラーなしで機能します。ただし、python3 または絶対インポートが指定されている場合は失敗するため、非推奨のスタイルは使用したくありません。
import pkg.a
これも機能しますが、特に追加のサブパッケージがある場合は、コードが少し冗長になります。
from pkg import a
これは失敗します。 ImportError: cannot import name a
from . import a
これも同じエラーで失敗します。
これらの import ステートメントが異なる動作をもたらすのはなぜですか? 最後の 2 つのスタイルが失敗するというのは奇妙に思えます。私はpython 2.7を使用しています。
編集:
これをテストするには、次のコードで test.py を作成します。
import pkg.a
編集:
また、as
構文を使用して import ステートメントでインポートされたシンボルを短縮しようとすると、それ以外の場合は機能しますが、失敗しますが、次のようになりますAttributeError
。
import pkg.a as a