1

インポートに行き詰まっており、問題に対処する方法がわかりません。

私は3つのモジュールを持っています:

  1. test_project.py
  2. modules/__init__.py
  3. r.py
  4. module.py
  5. module_configuration.py

依存関係のリスト:

test_project.py IMPORTS modules/__init__.py
modules/__init__.py IMPORTS r.py 
r.py IMPORTS > module_configuration.py 
module_configuration.py IMPORTS > modules/__init__.py

ご覧のとおり、ここには循環インポートがあります。

  • modules/__init__.pyクラス定義 (R のようなクラス) の dict を保持します。
  • Rクラスは、そのコンストラクターで ModuleConfiguration のインスタンスを作成します
  • ModuleConfigurationからのクラスの辞書が必要modules/__init__.pyです。

私が得るエラーメッセージ:

ERROR: controller.test_project (unittest.loader.ModuleImportFailure)
----------------------------------------------------------------------
ImportError: Failed to import test module: controller.test_project
Traceback (most recent call last):
File "/usr/lib/python2.7/unittest/loader.py", line 252, in _find_tests
module = self._get_module_from_name(name)
File "/usr/lib/python2.7/unittest/loader.py", line 230, in  
_get_module_from_name__import__(name)
File "/media/103AEB9B3AEB7C5A/Projekty/c/svn/tests/controller/test_project.py",    
line 9, in <module>
from c.core.modules import MODULES
File "/media/103AEB9B3AEB7C5A/Projekty/c/svn/tests/../c/core/modules/__init__.py", line 5, in <module>
from R import R
File "/media/103AEB9B3AEB7C5A/Projekty/c/svn/tests/../c/core/modules/R.py", line  6, in <module>
from c.core.module import Module
File "/media/103AEB9B3AEB7C5A/Projekty/c/svn/tests/../c/core/module.py", line 13, in <module>
from c.core.module_configuration import ModuleConfiguration
File "/media/103AEB9B3AEB7C5A/Projekty/c/svn/tests/../c/core/module_configuration.py", line 7, in <module>
from c.core.modules import MODULES

ImportError: cannot import name MODULES

それを解決する方法についてのアイデアはありますか?

4

1 に答える 1

1

モジュールのロード時にインスタンスを作成する代わりに、関連する結果を返す関数を実装し、これらの関数をそれぞれのモジュールに保持します。次に、モジュールがロードされると、すべてがすべての人に利用可能になります。moduleBからmoduleAをインポートし、moduleAからmoduleBをインポートしても問題はありません。モジュールのロード時に作成する必要があるモジュールグローバルオブジェクトが必要ですか?通常、これは必要ありません。代わりに、すべてのモジュールが配置されたら、最初の使用で必要なモジュールグローバルを構築してみてください。

于 2012-07-13T13:32:35.210 に答える