1

次の 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
4

0 に答える 0