Modules can周期性地相互导入,但有一个问题。在简单的情况下,它应该通过移动import
声明到文件底部或不使用from
syntax.
这就是为什么它有效:
当你导入一个模块时,Python 首先检查sys.modules
。如果它在那里,它就从那里导入。如果不存在,它会尝试以正常方式导入它;基本上,它找到该文件并运行其中的内容。
运行模块会填充模块的内容。例如,假设我们有这个模块,创造性地命名为example_opener
:
import webbrowser
def open_example():
webbrowser.open('http://www.example.com/')
开始时,模块是空的。然后Python执行:
import webbrowser
之后,该模块仅包含webbrowser
。然后Python执行这个:
def open_example():
webbrowser.open('http://www.example.com/')
Python 创建open_example
。现在该模块包含webbrowser
and open_example
.
Say webbrowser
包含这段代码:
from example_opener import open_example
def open(url):
print url
Say example_opener
首先导入。执行此代码:
import webbrowser
webbrowser
尚未导入,因此 Python 执行的内容webbrowser
:
from example_opener import open_example
example_opener
has已导入,但尚未完全执行。 Python 不在乎。 Python将模块拉出sys.modules
。在此刻,example_opener
仍然是空的。还没有定义open_example
然而,甚至还没有完成导入webbrowser
。 Python找不到open_example
in example_opener
,所以失败了。
如果我们导入怎么办open_example
从年底开始webbrowser
and webbrowser
从年底开始example_opener
? Python 将首先执行以下代码:
def open_example():
webbrowser.open('http://www.example.com/')
webbrowser
尚不存在,但直到open_example
叫做。现在example_opener
仅包含open_example
。然后它执行:
import webbrowser
还没有导入,所以Python执行webbrowser
。开始:
def open(url):
print url
它定义了open
。然后它执行:
from example_opener import open_example
example_opener
is in sys.modules
,所以它使用它。example_opener
包含open_example
,所以成功了。 Python完成导入webbrowser
。导入完毕webbrowser
from example_opener
。这是最后一件事example_opener
,所以导入example_opener
完成,也成功。