5

次のPythonコードの場合:

first.py

# first.py
from second import Second

class First:
    def __init__(self):
        print 'Second'

second.py

# second.py
from first import First

class Second:
    def __init__(self):
        print 'Second'

ファイルを作成し、シェルから以下を実行した後:

python first.py

エラーが発生します:ImportError: cannot import name Second

Rubyのような他の動的言語にはこの種の問題がありますか?私が尋ねている理由は、2つのモデルが相互に依存しているDjangoプロジェクトでこの問題が発生しているためです。考えられる解決策は、プロジェクトを再設計するか、オンデマンドでインポートすることです。他の動的言語の開発者がこの問題を経験したかどうかを知りたいだけです。

4

6 に答える 6

12

Pythonは、ある程度循環インポートを処理できます。意味がわからない場合でも、解決策はおそらく別の言語では意味がありません。問題のほとんどは、の代わりにを使用import firstして後で参照することで解決できます。first.Firstfrom first import First

共有コードを独自のモジュールに移動するか、循環インポートの必要性を何らかの方法でリファクタリングできるとよいでしょう。循環インポートは常に設計上の問題を示します。

于 2010-02-17T22:48:05.947 に答える
3

再帰的定義は、動的言語に限定された問題ではありません。また、静的型言語でも問題になることがよくあります。タイプの1つが定義される前に使用されるため、コンパイルエラーとして表示される場合があります。

一部の言語では、解決策は前方宣言を使用することです。他の言語は、一度に複数のファイルをコンパイルすることで問題を解決します。

Pythonでは、インポートをトップレベルから必要な関数に移動することで問題を解決できます。また、循環参照は実際にはエラーではないため、注意すれば、とにかく機能させることができます。

于 2010-02-17T22:48:13.077 に答える
2

他のすべてのポスターは、循環インポートが構造的に修正する必要がある深刻な問題であることを正しく示しています。

ただし、特にPython / Djangoモデルでは、文字列名を使用して外部キーを設定し、これらの循環依存の問題を回避できます-

#appA/models.py
class A(models.Model):
  b = models.ForeignKey('appB.b')

#appB/models.py
class B(models.Model):
  a = models.ForeignKey('appA.a')

DBテーブルでの循環参照は、必ずしも悪いことではありません(ただし、常に良いとは限りません)。Djangoでは、必要な状況で役立つ文字列を使用してキーを定義できます。実際に2つのクラスを相互にインスタンス化する必要がある場合は、より大きな問題が発生します。

于 2010-02-17T22:57:00.517 に答える
1

論理的には、これはパラドックスです。これは、コード形式の鶏が先か卵が先かという問題です。それらの1つが最初に来る必要があります。他の人が提案しているように、画板に戻ってください。そうすれば、長期的にはより良い結果が得られます。言語はあなたが理由でこのようなことをするのを妨げます!

于 2010-02-17T22:52:05.297 に答える
1

インポートをモジュールの最後に移動しただけの場合、循環インポートは期待どおりに機能することに注意してください。そのようです:

first.py

# first.py
class First:
  def __init__(self):
    print 'Second'
from second import Second

second.py

# second.py
class Second:
    def __init__(self):
        print 'Second'
from first import First

FredrikLundhのインポートリファレンスは一読の価値があります。ただし、他の人がアドバイスしているように、循環インポートを完全に回避するには、コードを再調整することをお勧めします。

于 2010-02-18T01:18:53.653 に答える
-1

これは「動的」言語に関連する問題ではありません。これはアーキテクチャ上の問題です。物事をどのように構成したかをよく見る必要があります。

于 2010-02-17T22:49:03.567 に答える