2012-04-16 22 views
0

可能性の重複:
Python: Circular (or cyclic) importsPythonでインポートが競合していますか?

私は、Pythonに新たなんだ、と私は問題を抱えているが、これは私の問題であるならば、私は正確にはわかりません。私は2つのファイルuser.pyとcomments.pyを持っています。 user.pyでは、私は

from comments import Comment 

を行うと、comments.pyに私は

from user import User 

私のユーザー負荷罰金を行うが、私はコメントにつながるURLを読み込むとき、私は、サーバーエラーが発生します。 from comments import Commentをコメントアウトすると問題が解決されます。私は何か間違っているのですか?

+1

「comments.py」ファイルの内容を表示できますか? – Tadeck

答えて

1

はい、循環インポートがあり、多くの問題が発生します。インポート時に実際に何が起こっているか考えてみると、「ファイルxのコードをこのファイルにコピーする」と似ていますが、xからyにコピーしてからyからxに戻すと、通訳者がどのモジュールがどのような状況に置き換わるか、どのモジュールに置き換えられるかを理解することは不可能ではありません。しかし、あなたのプログラムが適切に設計されていれば、あなたは何も持っていないはずです。この循環的なインポートを持つ理由は何ですか?私たちが問題を少し慎重に見ても、実際にはそれを必要としない可能性があります。

+0

どちらのファイルも互いに必要です。これを修正する方法はありませんか? – Snowman

+3

@mohabitar:はい、あなたのデザインを修正してください。 –

+0

あなたの洞察力Svenに感謝します。とにかく、私は2つの別々のファイルに自分のコードを整理すると思った。コメントに関連する関数と同じファイルにUserに関連する関数が存在することは望ましくありません。だから私はそれらを分けた。しかし、ユーザーはコメントを投稿でき、コメントにはユーザーが必要なので、それらを参照する必要があります。これを行うより良い方法はありますか? – Snowman

1

この種の循環インポートは機能しません。モジュールをインポートするということは、基本的にはモジュール内のステートメントを実行することを意味します。 importステートメントは、遭遇した瞬間に実行されるため、他のモジュールがまだ初期化されていないモジュールの少なくとも1つで、インポートが失敗します。

循環依存性は反パターンとみなされます。彼らが何らかの形で自然発生する状況がありますが、一般的には悪いデザインの兆候です。

インポートステートメントの1つをモジュールの最後または機能レベルに移動することで、この機能を有効にできますが、これらの「修正プログラム」に対してはお勧めします。

関連する問題