1

同じディレクトリに保持されている一連のPythonモジュールが作成されており、ImportErrorで問題が発生しています。

私が使用している3つのモジュールは、、draw_menu.pyです。errors.pyfile_operations.py

エラーコードのリストが必要な場合、コードを含むファイルを開くためにerrors.pyで定義されたカスタムメソッドを使用しているため、she-bangのすぐ下(クラス定義の上)を使用しています。file_operations.pyimport file_operations

file_operations.py定義されたメソッドを使用してerror.py、エラー(ファイルが見つからないなど)時にエラーメッセージを出力します。したがってimport errors、私はここでも同じように。

上記は正常に機能してdraw_menu.pyいますが、ファイルを使用してASCIIメニューのオプションを定義するを使用する場合(したがって、使用していますimport file_operations)、ImportErrorが発生します。

ImportError: cannot import name file_operations

これは、「インポートツリー」が次のように流れるためだと理解しています。

draw_menu<- file_operations<- errors<-file_operations

各モジュールを個別に使用できることが重要です。なぜこれが問題になるのでしょうか。また、削除せずにこれを克服するにはどうすればよいimport file_operationsですerrors.pyか。

ありがとうございました

トム

4

3 に答える 3

2

循環インポートは、Pythonで問題を引き起こす可能性があります(ご想像のとおり)。次の場合は、おそらく確認する価値があります。

A)errors.pyとfile_operation.pyは単一のモジュールである必要があります(両方が互いに非常に大きく依存している場合、それらは別々である必要がありますか?)

B)importいずれかのモジュールでを遅らせることができます。関数内のインポートステートメントは、関数が呼び出されるまで実行されません。通常、モジュールの先頭でインポートすることをお勧めしますが、Pythonでは必要ありません。このような状況では、インポート中の循環参照を回避できます。

于 2010-07-13T09:24:28.267 に答える
1

問題はインポート自体ではなく、依存関係です。インポートするまで処理できませんが、file_operationsインポートするまで処理できません。Pythonはこれを不可能な状況として認識し、エラーを発生させます。errorserrorsfile_operations

これに対する最善の解決策は、ファイルをリファクタリングして、この循環依存関係がなくなるようにすることです。これが実際に不可能な場合、代替ソリューションは、モジュールの1つを変更して、問題のあるインポートがトップレベルではなく、それを必要とする関数内で行われるようにすることです。これは、モジュールの初期処理がインポートに依存しないため、成功することを意味します。

于 2010-07-13T09:25:07.787 に答える
0

循環依存関係を解消する以外に、インポート呼び出しの場所を移動してみることができます。Pythonでのインポートは単なる通常のステートメントであるため、たとえば関数内でインポートできることを忘れないでください。

問題は、インポート(副作用として)が実際にインポートされるモジュールを実行することです(初めてインポートを呼び出すとき)。したがって、元のモジュールをインポートするモジュールをインポートする場合、混乱が生じます。

実際に使用する必要がある時点でerrors/file_operationsをインポートするだけで、問題を緩和できる場合があります。これは関数内にある可能性があります。したがって、関数の呼び出しをエラーでラップする可能性があります。


def print_error_message(err):
    from errors import print_error_message as _print_error_message
    _print_error_message(err)

そうすれば、通常のインポートが実行された後にのみエラーをインポートできます。

于 2010-07-13T09:28:24.777 に答える