循环导入的python解决方法

Ada*_*ths 2 python import module circular-dependency python-2.7

好的,就是这样。

我不想放弃我的代码,但是如果您确实需要它,我会的。我有两个彼此需要一点点的模块。这些模块称为webhandler和datahandler。

在webhandler中,我有一行:

import datahandler 
Run Code Online (Sandbox Code Playgroud)

在数据处理程序中,我还有另一行:

import webhandler
Run Code Online (Sandbox Code Playgroud)

现在我知道这是糟糕的代码,并且这样的循环导入会导致代码运行两次(这是我试图避免的事情)。

但是,数据处理程序模块需要访问Web处理程序模块中的多个功能,并且Web处理程序模块需要访问在数据处理程序模块中生成的多个变量。除了将功能移动到不同的模块之外,我没有看到其他解决方法,但这会破坏程序的组织,并且对模块命名没有逻辑意义。

有什么帮助吗?

pok*_*oke 8

循环依赖是代码异味的一种形式。如果您有两个相互依赖的模块,那么这是一个非常糟糕的迹象,您应该重构您的代码。

有几种不同的方法可以做到这一点;哪个最好取决于你在做什么,以及每个模块的哪些部分被另一个模块实际使用。

  • 一个非常简单的解决方案是合并两个模块,因此您只有一个仅依赖于自身或依赖于其自身内容的模块。这很简单,但是由于您之前已经分离了模块,因此您可能会以这种方式引入新问题,因为您不再需要分离关注点。
  • 另一种解决方案是确保确实需要依赖项。如果模块中只有少数部分依赖于其他部分,也许您可​​以以不再需要循环依赖的方式移动这些部分,或者利用导入的工作方式使循环依赖不再成为问题.
  • 更好的解决方案可能是将依赖项移动到一个单独的新模块中。如果命名真的是最难的问题,那么您可能做对了。它可能会“破坏 [你的] 程序的组织”,但由于你有循环依赖,无论如何你的设置存在一些固有的错误。


Mic*_*ert 5

其他人关于不进行循环导入的说法是最好的解决方案,但是如果您最终绝对需要它们,则通常仅在其中一个模块的一种方法或功能之内。因此,您可以安全地执行以下操作:

#modA.py
import modB

#modB.py
def methodDependingOnA():
    import modA
    ...
Run Code Online (Sandbox Code Playgroud)

每次调用该函数时都会有一点开销,但是除非一直被调用,否则导入的开销很低。