在python中导入冲突?

Import conflict in Python?

本问题已经有最佳答案,请猛点这里访问。

Possible Duplicate:
Python: Circular (or cyclic) imports

我对python还不熟悉,我有一个问题,但我不确定这是否是我的问题。我有两个文件,user.py和comments.py。在user.py中,我知道

1
from comments import Comment

在评论中,是的。

1
from user import User

我的用户加载得很好,但是当我加载导致注释的URL时,会得到一个服务器错误。评论from comments import Comment解决了这个问题。我做错什么了吗?

  • 你能给我们看一下comments.py文件的内容吗?


这种循环导入不起作用。导入模块实质上意味着执行其中的语句。import语句在遇到时执行,因此在至少一个模块中,另一个模块尚未初始化,因此导入将失败。

循环依赖项被视为反模式。有些情况下,它们以某种方式自然发生,但一般来说,它们是坏设计的标志。

您可以通过将其中一条导入语句移动到模块末尾或函数级别来实现这一点,但我建议不要使用这些"修复程序"。


是的,您有一个循环导入,这会导致许多问题。如果您考虑导入时实际发生的情况,这类似于说,"将代码从文件x复制到这个文件中",但是如果您从x复制到y,然后从y复制到x,那么您已经创建了一个无限循环,在这个循环中,解释程序很难确定应该替换哪个模块,或者加载哪个模块,在这个模块中暗示。但是,如果您的程序架构正确,则不应该有任何。你为什么要循环进口?如果我们更仔细地研究这个问题,很可能你根本不需要它。

  • 两个文件都需要对方。没有办法解决这个问题吗?
  • @莫哈比塔:是的,修好你的设计。
  • 感谢您的洞察力。不管怎样,我想我只需要把代码组织成两个单独的文件。我不希望与用户相关的函数与注释相关的函数在同一个文件中。所以我把他们分开了。但由于用户可以发表评论,而评论需要用户,所以我确实需要引用它们。有更好的方法吗?
  • @Mohabitar如果你有一个合适的设计,你的模块应该开始有一个生产者/数据源>用户/消费者的模式。这个链可以在多个层次上继续,但是通过这种方式组织项目,对代码所做的事情的责任变得更加明确,像循环导入这样的问题在很大程度上消失了。
  • @Mohabitar是一个用户拥有的评论,还是一个评论有一个用户做出了评论?除非有一个非常有说服力的理由让这种关系是双向的,否则只建立一次这种联系可能是更好的方式。用户需要从注释中获取什么数据,反之亦然?
  • 谢谢,我可以清理一下我的代码并解决这个问题。