Python设计 - 交叉导入

时间:2012-07-13 13:18:42

标签: python design-patterns import

我坚持使用进口,不知道如何解决这个问题。

我有3个模块:

  1. test_project.py
  2. modules/__init__.py
  3. r.py
  4. module.py
  5. module_configuration.py
  6. 依赖项列表:

    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的类)。
    • 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
    

    关于如何解决它的任何想法?

1 个答案:

答案 0 :(得分:1)

不是在模块加载时制作实例,而是实现返回相关结果的函数,并将这些函数保存在各自的模块中。然后,一旦模块加载,所有人都可以使用。 从moduleB导入moduleA和从moduleA导入moduleB没有任何问题。 您是否需要必须在模块加载时创建的模块全局对象?通常不需要这样做。相反,尝试构建所有模块到位后首次使用所需的模块全局变量。

相关问题