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

ryn*_*ynd 5 python import include

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

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

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

我该如何处理在Python循环依赖以最小的大惊小怪

Gar*_*tty 16

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

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

python中存在解决此问题的方法:

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

但不,你不能预先解析文件.这不是Python的工作方式,如果你研究一下Python是如何工作的,那很明显.

  • 在ORM样式模型中,ObjectA具有许多ObjectB,而ObjectB属于ObjectA.这是一个常见的循环依赖,似乎完全有道理.有没有很好的方法从设计中删除该依赖? (4认同)

jcd*_*yer 5

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

filea.py

import fileb

def filea_thing():
    return "Hello"

def other_thing():
    return fileb_thing()[:10]
Run Code Online (Sandbox Code Playgroud)

fileb.py

def fileb_thing():
    import filea
    return filea.filea_thing() + " everyone."
Run Code Online (Sandbox Code Playgroud)

这样一来,FILEA交易只会当你调用fileb_thing(),然后将其reimports FILEB,但由于fileb_thing没有得到在这一点上叫,你不坚持循环各地进口.

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