7

これもまた、私が輪になって走り回っていて、暴れまわろうとしている場合です。

Pythonが最初にすべてのファイルを分析して、最初からすべての識別子を認識できるようにしたいと思います(Javaと同じように思います)。

「main.py」と「gui.py」があります。すべてのファイルには、他のファイルのクラスを利用するクラスが含まれています。「main.py」を実行しようとすると、インタープリターは「gui」をインポートし、「gui.py」では「main」をインポートして、メインモジュール全体を処理し、「Tee-hee、クラスはありません」と言います。 gui.pyに指定された名前が付いています。」

Pythonで循環依存を最小限の手間で処理するにはどうすればよいですか?

4

3 に答える 3

17

これをコメントではなく回答に拡張したいと思いました。

循環インポートは一般に悪いデザインの兆候であることに注意する価値があります。あなたのデザインに合った言語を要求する代わりに、そのデザインを変更してみませんか?

Pythonでこの問題を回避する方法があります:

  • 良いオプション:循環インポートを使用しないようにコードをリファクタリングします。
  • 悪いオプション:importステートメントの1つを別のスコープに移動します。

ただし、ファイルを事前に解析することはできません。これはPythonの動作方法ではありません。Pythonの動作を調べると、その理由は明らかです。

于 2012-04-11T20:36:27.987 に答える
6

循環インポートを回避できない場合は、インポートの1つをモジュールレベルのスコープから移動し、それが使用されていたメソッド/関数に移動します。

filea.py

import fileb

def filea_thing():
    return "Hello"

def other_thing():
    return fileb_thing()[:10]

fileb.py

def fileb_thing():
    import filea
    return filea.filea_thing() + " everyone."

このように、fileaはfileb_thing()を呼び出したときにのみインポートされ、次にfilebを再インポートしますが、その時点ではfileb_thingが呼び出されないため、ループを続けることはありません。

他の人が指摘しているように、これはコードの臭いですが、醜い場合でも何かを行う必要がある場合があります。

于 2012-04-11T21:07:42.747 に答える
3

一般に、依存関係はツリーである必要があります。循環依存は解決できません。

ただし、これを解決する通常の方法は、グローバル名前空間以外のレベルで必要なモジュールの「ローカルインポート」を実行することです。

于 2012-04-11T20:40:38.833 に答える