2

やってはいけないことをして、途中でテストを実行せずに 4 つのモジュール (6 時間ほど) を書きました。

called内にメソッドがあり、/mydir/__init__.pycalledget_hash()内にクラスがあります。/mydir/utils.pySpamClass

/mydir/utils.pyから輸入get_hash()/mydir/__init__ます。

/mydir/__init__.pyから輸入SpamClass/mydir/utils.pyます。

クラスとメソッドの両方が単独で正常に動作しますが、何らかの理由で をインポートしようとすると、 from/mydir/というインポート エラーが発生します。"Cannot import name get_hash"/mydir/__init__.py

唯一のスタック トレースは、__init__.pyimportedという行SpamClassです。SpamClass次の行は、インポートしようとしたときにエラーが発生した場所get_hashです。どうしてこれなの?

4

3 に答える 3

2

他の人が言ったことに加えて、循環インポートの問題を回避するための別の良いアプローチは、回避 from module import stuffすることです。

import module各スクリプトの先頭で標準をmodule.stuff実行し、関数を記述すると、それらの関数が実行されるまでにインポートが完了し、モジュール メンバーがすべて使用可能になります。

また、一部のモジュールがメンバーの 1 つを更新/変更できる (または悪意のあるサード パーティによってモンキー パッチが適用される) 状況について心配する必要もありません。モジュールをインポートfromした場合、メンバーの古い古いコピーがまだ残っています。

個人的には、私が頻繁に参照する可能性が高い単純で依存関係のないメンバー、特に記号定数に対してのみfrom-を使用します。import

于 2010-04-15T17:13:37.813 に答える
2

これは非常に簡単に遭遇する問題です。何が起こっているかというと、インタープリターが__init__.pyファイルを 1 行ずつ評価するということです。次のコードがある場合:

 import mydir.utils
 def get_hash(): return 1

__init__.pyインタープリターは、 'mydir/utils.py' を完全に実行するまで処理を一時停止しますimport mydir.utils。そのため、utils.py が get_hash() をインポートしようとすると、インタープリターがまだ定義されていないため、定義されません。

于 2010-04-15T17:02:36.990 に答える
1

詳細な情報がない場合は、回避していない循環インポートがあると思います。最も単純で明白な修正方法は、mydir/__init__.pyのモジュールから使用したいものを何も入れないことです。そのため、関数をパッケージ内の別のモジュールに移動し、そのモジュールを必要な場所にインポートします。 mydirget_hashmydir

于 2010-04-15T17:02:10.690 に答える