【问题标题】:Circular function import循环函数导入
【发布时间】:2014-11-07 22:12:56
【问题描述】:

我正在尝试在 python 2.6 中执行以下操作。

my_module.py:-
    from another_module import another_factory

    def my_factory(name):
        pass

another_module.py:-
    from my_module import my_factory

    def another_factory(name):
        pass

两个模块在同一个文件夹中。

它给了我错误:

Error: cannot import name my_factory

【问题讨论】:

  • 请显示您项目的文件夹和模块的结构
  • 你尝试第一种方法时能显示错误吗?以及您如何尝试使用该功能的示例。
  • 您是否收到错误消息?究竟会发生什么? “不工作”信息不足以诊断问题。
  • my_module 是否导入 another_module,反之亦然?
  • @ikaros45 是的,这在 python 中可行吗?

标签: python python-2.6


【解决方案1】:

从 cmets 中可以看出,您正在尝试进行不可能的圆形导入。

如果在您的模块 A 中您尝试从模块 B 导入某些内容,并且在加载模块 B(以满足此依赖关系)时您尝试从模块 A 中导入某些内容,那么您就在您开始的地方并且您得到了一个circle import: A 需要 B,B 需要 A!!,有点像说 A 需要 A,很不合逻辑。

例如:

# moduleA
from moduleB import functionB
...

于是解释器尝试加载moduleB,如下所示:

# moduleB
from moduleA import functionA
...

然后回到模块A,它再次尝试导入B,等等。因此python只是引发错误并停止疯狂以获得更大的利益。

依赖项不是这样工作的。定义哪个模块需要另一个模块,然后进行简单的导入。在您的示例中,似乎another_module 需要my_module,因此更改my_module 并消除对another_module 的依赖。

如果两个模块确实相互需要,这是一个明确的标志,它们属于同一个逻辑概念,应该合并。

PD:在某些情况下,为了避免大文件,您可以将一个逻辑单元一分为二,为了避免循环依赖,您将导入写入函数内部(在加载时不执行),这样就可以不是一个圆圈。然而,这通常是要避免的。

【讨论】:

    【解决方案2】:

    真正的问题是……你认为每个文件都是一个模块还是的一部分?

    尝试在 package 之外导入 modules 有时会很痛苦。您应该通过简单地在目录中创建一个空的 __init__.py 模块来构建一个包。不过,如果你有

    __init__.py
    my_module.py
    another_module.py
    

    如果你在 my_module.py 中有以下函数,

    def my_factory(x):
        return x * x
    

    您应该可以通过编写以下代码从 another_module.py 访问 my_factory() 函数:

    from my_module import my_factory
    

    但是,如果您没有 __init__.py 文件/模块,则导入功能将(不知何故)丢失并且只会使用 sys.path用于搜索其他模块。然后,您可以在 another_module.py 文件中添加以下行(在 import 之前):

    sys.path.append(os.path.dirname(os.path.expanduser('.')))
    

    您还可以使用各种可用的包来帮助导入模块,例如 impimport_file(请参阅文档)。或者您可以决定使用 load_source(另请参阅文档:https://docs.python.org/2/library/imp.html

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-12-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-11-02
      • 1970-01-01
      • 2022-06-28
      • 1970-01-01
      相关资源
      最近更新 更多