【问题标题】:Circular import issue in python. How to resolve it?python中的循环导入问题。如何解决?
【发布时间】:2020-04-20 20:21:50
【问题描述】:

你好!

通常,循环导入意味着代码中存在结构问题,但我看不到任何其他方法可以解决此问题。 这是我目前的情况:

我有两个班级:ProjectPreset

Project 有一个方法可以生成Preset,类似于:

from preset import Preset

class Project():

    def __init__(self, project):
        self._project_name = project

    def get_preset(self, preset_name):
        return Preset(preset_name, self._project_name)

然后,我有 Preset 类,它还需要一个 Project 名称来初始化。比如:

from project import Project

class Preset():

    def __init__(self, preset_name, project_name):
        self._project = Project(project_name)

一般来说,我将始终通过Project 类使用get_preset 方法创建Presets,但我还想提供直接创建Preset 的可能性,而不必创建Project首先。

有摆脱这种循环递归的想法吗?

谢谢!!

【问题讨论】:

  • get_presetProject移动到Preset并在Project.get_preset内调用Preset.get_preset(preset_name)?
  • 我已经更新了代码示例,因为它是错误的。 Preset初始化需要preset_name和preset所属的project_name,所以我不能这样解决:(谢谢!!!
  • 当您访问项目的预设时,它会在其中创建一个带有 new 项目的预设,而不是引用与其关联的实际项目,这似乎很糟糕。但撇开这些不谈,循环引用仍然很糟糕。 Preset 需要 Project 提供什么,Project 需要 Preset 提供什么?如果其中任何一个的答案是“无”,则您没有逻辑依赖,因此您应该删除导入依赖。否则,找出改变其中一个答案的方法。 :)
  • 我已经将Project 对象传递给Preset 构造函数。无论如何,由于类型提示,我仍然得到循环依赖。我修复了:if typing.TYPE_CHECKING: import Preset。我一点也不喜欢,但是……谢谢大家!

标签: python circular-dependency


【解决方案1】:

您可以将第一个导入移动到 get_preset 函数中。

【讨论】:

  • 是的......这可以工作,但是......它真的是pythonic吗?
  • 如果您致力于在项目中使用循环依赖项,那么您将不得不忍受丑陋的代码才能使它们工作。如果可能的话,最好删除循环! :)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2014-12-10
  • 1970-01-01
  • 2023-03-29
  • 1970-01-01
  • 2016-07-10
  • 2021-03-12
  • 2023-03-05
相关资源
最近更新 更多