Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/19.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在Python中导入冲突?_Python - Fatal编程技术网

在Python中导入冲突?

在Python中导入冲突?,python,Python,可能重复: 我是Python新手,我遇到了一个问题,但我不确定这是否是我的问题。我有两个文件,user.py和comments.py。在user.py中,我是这样做的 from comments import Comment 在comments.py中,我是这样做的 from user import User 我的用户加载得很好,但是当我加载导致评论的URL时,我得到一个服务器错误。从comments import Comment注释中注释掉,修复了该问题。我做错什么了吗?是的,您有一个循

可能重复:

我是Python新手,我遇到了一个问题,但我不确定这是否是我的问题。我有两个文件,user.py和comments.py。在user.py中,我是这样做的

from comments import Comment
在comments.py中,我是这样做的

from user import User

我的用户加载得很好,但是当我加载导致评论的URL时,我得到一个服务器错误。从comments import Comment注释中注释掉
,修复了该问题。我做错什么了吗?

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

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

循环依赖项被视为反模式。有些情况下,它们会自然而然地发生,但总的来说,它们是一个糟糕设计的标志


您可能可以通过将其中一个导入语句移动到模块末尾或功能级别来实现这一点,但我建议不要使用这些“修复”。

您能否向我们展示
comments.py
文件的内容?两个文件都需要对方。没有办法解决这个问题吗?@mohabitar:是的,解决你的设计。谢谢你对Sven的洞察。无论如何,我想我应该把代码组织成两个独立的文件。我不希望与用户相关的函数与与与注释相关的函数位于同一个文件中。所以我把他们分开了。但由于用户可以发布评论,而评论需要用户,所以我确实需要引用它们。有更好的方法吗?@mohabitar如果你有一个合适的设计,你的模块应该开始有一个producer/datasource>user/consumer的模式。此链可以持续到多个级别,但通过以这种方式组织项目,对代码的责任会变得更加清晰,循环导入之类的问题在很大程度上会消失。@mohabitar是用户拥有的注释,还是注释有用户创建的注释?除非有非常令人信服的理由让这种关系是双向的,否则只有一次联系可能是更好的方式。用户需要评论中的哪些数据,反之亦然?