2012-07-13 3 views
1

수입 문제가있어 문제를 해결하는 방법을 모르겠습니다.Python 디자인 - 교차 import

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

을에 의존적 목록 :

나는 3 개 모듈이 처리 건수 :

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 클래스는 modules/__init__.py에서 클래스의 딕셔너리를 필요로 ModuleConfiguration 생성자
  • 에 ModuleConfiguration의 인스턴스를 만든다.

오류 메시지 내가 얻을 : 그것을 해결하는 방법에 대한

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 

어떤 아이디어?

+1

그럼 ... 어떻게 문제가 되나요? –

답변

1

인스턴스를로드 할 때 모듈을로드하는 대신 관련 결과를 반환하는 함수를 구현하고 해당 함수를 각 모듈에 보관하십시오. 그런 다음 모듈이로드되면 모든 것을 모두 사용할 수 있습니다. moduleA에서 moduleA 및 moduleB를 가져 오는 중 아무 문제가 없습니다. 모듈로드 시간에 만들어야하는 모듈 전역 개체가 필요합니까? 이것은 일반적으로 필요하지 않습니다. 대신 모든 모듈이 제자리에 배치되면 처음 사용할 때 필요한 모듈 전역을 구성하십시오.

+0

사전은 클래스 이름 만 유지하고 인스턴스는 유지하지 않습니다. 이 목록을 GUI에 전달하고 GUI가 콤보 상자를 선택하여 모든 항목에 자체 클래스가 있기 때문에 필요합니다. 그래서 클래스 이름과 '키'사이에 링크가 필요합니다. –

+1

각 모듈이 필요한 다른 모듈을 먼저로드 한 다음 모듈의 끝에 모듈을 호출하여 클래스 목록을 설정하는 메소드를 호출하십시오. 당신이 직면 한 정확한 문제는 무엇입니까? –

+0

이러한 클래스 이름으로 사전을 설정하려면 실제로 가져올 필요가 있습니다. 하지만 당신이 의미하는 바를 알고 있다고 생각합니다. 클래스 항목을 가진 모듈에 MODULES를 가져올 수 있습니다.이 클래스 이름을 MODULES에 추가하기 만하면, 클래스 이름을'modules/__ init __. py'에서 가져올 필요가 없습니다. 와우, 정말 고마워. 고마워! 때때로 그것은 단지 압도적 인 것입니다. –