私はお互いに異なる機能を使用する必要がある2つのファイルがあります。再帰インポート: 'import'と 'from ... import ...'
file1.py:
import file2 # from file2 import y2
def x1():
print "x1"
def x2():
print "x2"
file2.y2()
file2.py:
import file1 # from file1 import x1
def y1():
file1.x1()
print "y"
def y2():
print "y2"
if __name__ == "__main__":
y1()
私はimport file1
を使用する(作業していて、FILE1からわずか特定の機能を輸入している理由を知りたいですfrom file1 import x1
)はありませんか?
Traceback (most recent call last):
File "file2.py", line 1, in <module>
from file1 import x1
File "file1.py", line 1, in <module>
import file2
File "file2.py", line 1, in <module>
from file1 import x1
ImportError: cannot import name x1
私は輸入品についてthisを読んだ:
import X
はモジュール
X
をインポートし、そして 現在の名前空間でそのモジュールへの参照を作成します。そして、あなたはモジュール(例:X.name
またはX.attribute
)の内部から アクセス特定の属性やメソッドに完成されたモジュールのパスを定義する必要が
from X import *
すると、モジュール
X
をインポートして、作成されます現在の名前空間内のそのモジュールによって定義されたすべての公開オブジェクト への参照(つまり、_
で始まる名前を持たない すべて)またはwhateveあなたが言及したrの名前 。つまり、このステートメントを実行した後は、単純に という名前を使用して、モジュール
X
で定義されているものを参照するためにプレーンな(修飾されていない)名前を使用できます。 しかし、X
自体は定義されていないため、X.name
は機能しません。name
が既に定義されている場合は、新しいバージョンに置き換えられます。X
の名前が であると他のオブジェクトを指し示すように変更された場合、モジュールは通知しません。これにより、モジュールのすべての名前がローカル名前空間で使用可能になります。
サイクリックインポートを使用しません。関数が非常に密接に接続されている場合、それらは同じモジュールに属します。 – Daniel
@Daniel周期的なインポートはまれであるかもしれませんが、用途があります。 2つのモジュールが互いに依存しているからといって、それらが同じモジュールに属しているわけではありません。例えば、サブモジュールはその親をインポートする必要があります。 –