两个Python模块需要彼此的内容-这可以工作吗?

2024-04-27 00:09:45 发布

您现在位置:Python中文网/ 问答频道 /正文

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

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中,两个模块不能相互导入,并且所有模块导入都必须是层次结构的,这是一个简单的事实吗?还是我做错了什么?或者,是否有一个解决办法,没有把所有这些好的功能放在新的模块?


Tags: 模块namefromimport网络form瓶子auto
2条回答

不要做from ... import ...。只需import ...并使用模块名引用其对象。

模块可以循环地相互导入,但有一个陷阱。在简单的情况下,它应该通过将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

假设webbrowser包含以下代码:

from example_opener import open_example

def open(url):
    print url

假设example_opener是先导入的。执行此代码:

import webbrowser

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

from example_opener import open_example

example_opener已导入,但尚未完全执行。Python不在乎。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的导入也成功地完成了。

相关问题 更多 >