2016-03-25 26 views
4

私はお互いに異なる機能を使用する必要がある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の名前が であると他のオブジェクトを指し示すように変更された場合、モジュールは通知しません。

これにより、モジュールのすべての名前がローカル名前空間で使用可能になります。

+0

サイクリックインポートを使用しません。関数が非常に密接に接続されている場合、それらは同じモジュールに属します。 – Daniel

+1

@Daniel周期的なインポートはまれであるかもしれませんが、用途があります。 2つのモジュールが互いに依存しているからといって、それらが同じモジュールに属しているわけではありません。例えば、サブモジュールはその親をインポートする必要があります。 –

答えて

3

巡回輸入は通常、設計上の問題を示しているが、それらを解決するために、あなたはそうのように下部にimport文を書くことがあります。

def x1(): 
    print "x1" 

def x2(): 
    print "x2" 
    file2.y2() 

from file2 import y2 

それが回避策です覚えておいてください。理由from x import yは、周期的なインポートの場合には機能しません。最初にfrom ... import ...に到達すると、2番目のモジュールに渡され、2番目のモジュールが最初にコールバックすると、インタプリタはそれが終わりのないサイクルであることを認識し、部分的にインポートされたモジュール。関数が定義される前に起こる。y2という意味はまだ存在しない。

-1

bharelは、各モジュールがあることを、他のモジュールを必要とするため、あなたはXのインポートyから使用カントこの例外で

をオンに無限ループを引き起こして仕上げのロード前にお互いを呼び出し、それぞれの機能が維持というループを引き起こし述べたと同様完全にロードされてからインポートされます(インポートする名前まで)。 は、あなたがたが、Xのインポート*から使用することができます

上記のエラーを引き起こし、あなたが両方のファイル(または1)に必要な機能を分離することができ、簡単な輸入のx

に置き換えられますので、私はその推測別でファイルまたはその

から依存してインポートあなたも試してみると、例外を使用して試みることができる:

try: 
    from images.serializers import SimplifiedImageSerializer 
except ImportError: 
    import sys 
    SimplifiedImageSerializer = sys.modules[__package__ + '.SimplifiedImageSerializer'] 

このテーマには良いのトピック:

Circular (or cyclic) imports in Python

+0

あなたの例は、あなたがその質問を理解していないことを示しています。キーワードは* Cyclic imports *です。 – gdlmx

+0

あなたは間違いなく私は私が周期的な輸入で使うことができない理由を説明する編集を行います – zero

+0

@gdlmxそれを修正しました私はちょうど私がそれを答えると目を覚ましたことを認めなければなりません – zero

関連する問題