处理Python模块中的循环依赖项?

时间:2012-04-11 20:24:17

标签: python import include

这又是一个案例,我在圈子里跑来跑去,我即将疯狂。

我希望Python首先分析所有文件,以便从一开始就知道所有标识符(我认为像Java一样)。

我有一个“main.py”和一个“gui.py”。每个文件都包含一个类,该类使用另一个文件中的类。当我尝试运行“main.py”时,解释器导入“gui”,然后在“gui.py”中导入“main”,然后它处理整个主模块并说:“Tee-hee,没有类在gui.py中使用给定的名称。“

如何在Python 中处理循环依赖关系,并且最小化

3 个答案:

答案 0 :(得分:16)

我以为我会把它扩展为答案而不是评论。

值得注意的是circular imports are generally a sign of bad design:为什么不改变设计,而不是要求语言适合你的设计?

ways around this problem in python

  • 好的选择:重构代码,不要使用循环导入。
  • 错误选项:将您的一个import语句移到另一个范围。

但不,你不能预先解析文件。这不是Python的工作方式,如果你研究一下Python是如何工作的,那就明白为什么。

答案 1 :(得分:5)

如果无法避免循环导入,请将其中一个导入移出模块级作用域,然后移动到使用它的方法/函数中。

filea.py

import fileb

def filea_thing():
    return "Hello"

def other_thing():
    return fileb_thing()[:10]

fileb.py

def fileb_thing():
    import filea
    return filea.filea_thing() + " everyone."

这样,filea只会在你调用fileb_thing()时导入,然后重新导入fileb,但由于fileb_thing在那时没有被调用,所以你不会继续循环。

正如其他人所指出的那样,这是一种代码味道,但有时你需要做一些事情,即使它很难看。

答案 2 :(得分:3)

通常,依赖项应该是树。循环依赖关系无法解析。

解决这个问题的常用方法是在全局命名空间以外的级别对所需模块进行“本地导入”。