我有一个瓶子网络服务器模块,它有以下几行:
from foobar.formtools import auto_process_form_insert
而foobar.formtools
模块包含以下行:
from foobar.webserver import redirect, redirect_back
当然,两者都会导致以下错误(分别为):
ImportError: cannot import name auto_process_form_insert
ImportError: cannot import name redirect
在Python中,两个模块不能相互导入,并且所有模块导入都必须是层次结构的,这是一个简单的事实吗?还是我做错了什么?或者,是否有一个解决办法,没有把所有这些好的功能放在新的模块?
不要做
from ... import ...
。只需import ...
并使用模块名引用其对象。模块可以循环地相互导入,但有一个陷阱。在简单的情况下,它应该通过将
import
语句移动到文件的底部或不使用from
语法来工作。这就是为什么这样做的原因:
导入模块时,Python首先检查
sys.modules
。如果在里面,就从那里进口。如果它不在那里,它会尝试以正常的方式导入它;基本上,它会找到文件并运行其中的内容。运行模块会填充模块的内容。例如,假设我们有这个模块,创造性地命名为
example_opener
:开始时,模块是空的。然后Python执行:
之后,模块只包含
webbrowser
。然后Python执行:Python创建
open_example
。现在模块包含webbrowser
和open_example
。假设
webbrowser
包含以下代码:假设
example_opener
是先导入的。执行此代码:尚未导入
webbrowser
,因此Python将执行webbrowser
的内容:example_opener
已导入,但尚未完全执行。Python不在乎。Python从sys.modules
中取出模块。此时,example_opener
仍然是空的。它还没有定义open_example
,甚至还没有完成导入webbrowser
。Python在example_opener
中找不到open_example
,因此失败。如果我们从
webbrowser
结尾导入open_example
,从example_opener
结尾导入webbrowser
,会怎么样?Python将首先执行以下代码:webbrowser
还不存在,但在调用open_example
之前这并不重要。现在example_opener
只包含open_example
。然后执行:它尚未导入,因此Python将执行
webbrowser
。它开始于:它定义了
open
。然后执行:example_opener
在sys.modules
中,所以它使用它。example_opener
包含open_example
,因此成功。Python完成导入webbrowser
。这就结束了从example_opener
导入webbrowser
。这是example_opener
中的最后一件事,所以example_opener
的导入也成功地完成了。相关问题 更多 >
编程相关推荐