针对循环imp的python解决方案

2024-10-04 03:27:58 发布

您现在位置:Python中文网/ 问答频道 /正文

好吧,就是这样。在

我不想泄露我的代码,但如果你真的需要我会的。我有两个模块,需要互相学习。这些模块称为webhandler和datahandler。在

在webhandler中,我有一行:

import datahandler 

在datahandler中我有另一行:

^{pr2}$

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

然而,datahandler模块需要从webhandler模块访问几个函数,而webhandler模块需要访问datahandler模块中生成的几个变量。除了将函数移到不同的模块之外,我没有看到任何解决方法,但这会破坏程序的组织,并且对模块命名没有任何逻辑意义。在

有什么帮助吗?在


Tags: 模块方法函数代码import程序逻辑命名
3条回答

the webhandler module needs access to several variables that are generated in the datahandler module

将任何“生成的”数据推送到第三个位置可能是有意义的。因此datahandler函数在适当时调用config.setvar( name, value ),而{}函数在需要时调用config.getvar( name )config将是第三个子模块,包含您编写的简单setvar和{}函数(设置/获取全局字典元素的包装器是最简单的方法)。在

那么datahandler代码将import webhandler, config,而{}只需要import config。在

我同意poke然而,对这样一个问题的需求暴露了这样一个事实,即你可能还没有像你所想的那样把设计完成得既整齐又合乎逻辑。如果是我,我会重新思考模块划分的方式。在

其他人所说的不进行循环导入是最好的解决方案,但是如果您最终绝对需要它们,那么通常只需要其中一个模块的一个方法或函数。因此,您可以安全地执行以下操作:

#modA.py
import modB

#modB.py
def methodDependingOnA():
    import modA
    ...

每次调用函数时导入都会有一些开销,但除非一直调用,否则开销相当低。在

循环依赖是一种代码味道。如果有两个互相依赖的模块,那么这是一个非常糟糕的信号,您应该重新构造代码。在

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

  • 一个非常简单的解决方案是只合并两个模块,因此只有一个模块依赖于它自己,或者更确切地说,它自己的内容。这很简单,但是由于您以前有过分离的模块,因此很可能是因为您不再有关注点的分离而引入了新的问题。在
  • 另一个解决方案是确保依赖关系实际上是必需的。如果一个模块只有几个部分依赖于另一个模块,那么您可以移动这些位,使循环依赖不再是必需的,或者{a1}使循环依赖不再成为问题。在
  • 更好的解决方案可能是将依赖项移到一个单独的新模块中。如果命名真的是这方面最困难的问题,那么你可能做得对。这可能会“破坏[你的]程序的组织”,但由于你有循环依赖关系,你的设置本身就有问题。在

相关问题 更多 >