7

这又是一个我在兜圈子里跑来跑去的情况,我快要发疯了。

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

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

如何以最小的麻烦处理 Python 中的循环依赖关系?

4

3 回答 3

17

我想我会将其扩展为答案而不是评论。

值得注意的是,循环导入通常是糟糕设计的标志:与其要求语言适合你的设计,为什么不改变那个设计呢?

在 python 中有解决这个问题的方法:

  • 不错的选择:重构代码以不使用循环导入。
  • 糟糕的选择:将您的一个import语句移动到不同的范围。

但是不,您不能预解析文件。这不是 Python 的工作方式,如果你研究 Python 是如何工作的,原因就很明显了。

于 2012-04-11T20:36:27.987 回答
6

如果您无法避免循环导入,请将其中一个导入移出模块级范围,并移到使用它的方法/函数中。

文件.py

import fileb

def filea_thing():
    return "Hello"

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

文件b.py

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

这样,filea 只会在您调用 fileb_thing() 时被导入,然后它会重新导入 fileb,但由于此时不会调用 fileb_thing,因此您不会一直循环。

正如其他人所指出的,这是一种代码异味,但有时您需要完成某些事情,即使它很丑陋。

于 2012-04-11T21:07:42.747 回答
3

一般来说,依赖关系应该是一棵树。循环依赖是不可解决的。

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

于 2012-04-11T20:40:38.833 回答