【发布时间】:2013-12-21 08:31:03
【问题描述】:
试图找到一个好的和合适的模式来处理 Python 中的循环模块依赖。通常,解决方案是删除它(通过重构);但是,在这种特殊情况下,我们真的希望拥有需要循环导入的功能。
编辑:根据下面的答案,此类问题的通常攻击角度将是重构。但是,为了这个问题,假设这不是一个选项(无论出于何种原因)。
问题:
logging 模块需要configuration 模块来获取其某些配置数据。但是,对于某些configuration 函数,我真的很想使用logging 模块中定义的自定义日志记录函数。显然,在configuration 中导入logging 模块会引发错误。
我们能想到的可能解决方案:
不要这样做。正如我之前所说,这不是一个好的选择,除非所有其他可能性都是丑陋和糟糕的。
猴子补丁模块。这听起来还不错:将
logging模块动态加载到configuration中在初始导入之后,并且在实际使用它的任何功能之前。不过,这意味着定义全局的、每个模块的变量。依赖注入。我已经阅读并遇到了依赖注入替代方案(特别是在 Java 企业领域),它们消除了一些令人头疼的问题;但是,它们可能过于复杂而无法使用和管理,这是我们想要避免的。不过,我不知道全景图在 Python 中是如何描述的。
启用此功能的好方法是什么?
非常感谢!
【问题讨论】:
-
将共享位放入其自己的(第三个)文件中,并将其导入到其他两个文件中
-
将导入放在
if True:语句中是否可行? -
@JoranBeasley 这是最受欢迎的答案。很有可能这就是我们最终要做的事情。谢谢。
-
@jcfollower 是的,可能。那是一种猴子补丁,不是吗?谢谢!
标签: python module importerror cyclic-reference cyclic-dependency