两个 Python 模块需要彼此的内容——这能行吗?

我有一个瓶子网络服务器模块与以下行:

from foobar.formtools import auto_process_form_insert

foobar.formtools模块包含这一行:

from foobar.webserver import redirect, redirect_back

当然,这两种情况都会导致以下错误(分别) :

Import Error: 无法导入名称 auto _ process _ form _ insert
ImportError: cannot import name redirect

在 Python 中,两个模块不能相互导入,所有的模块导入都必须是分层的,这是一个简单的事实吗? 还是我做错了什么?或者,是否存在缺乏将所有这些好的函数放入新模块的解决方案?

55615 次浏览

模块 可以循环地相互导入,但有一个问题。在简单的情况下,它应该通过将 import语句移动到文件的底部或者不使用 from语法来工作。

原因如下:

导入模块时,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,现在模块包含 webbrowseropen_example

Say webbrowser contained this code:

from example_opener import open_example


def open(url):
print url

Say example_opener is imported first. This code is executed:

import webbrowser

webbrowser尚未导入,因此 Python 执行 webbrowser的内容:

from example_opener import open_example

导入了 example_opener 已经,但尚未完全执行。巨蟒不在乎。Python 从 sys.modules中提取模块。此时,example_opener仍然是空的。它还没有定义 open_example,甚至还没有完成导入 webbrowser。Python 无法在 example_opener中找到 open_example,所以它失败了。

如果我们从 webbrowser的末端导入 open_example,从 example_opener的末端导入 webbrowser会怎样?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_openersys.modules中,所以它使用。example_opener包含 open_example,所以它成功了。Python 完成导入 webbrowser。这意味着从 example_opener导入 webbrowser。这是 example_opener的最后一件事,所以 example_opener的进口完成,成功,以及。

不要执行 from ... import ...。只执行 import ...并使用模块名称引用它的对象。