我有一个带有以下行的Bottle Webserver模块:
from foobar.formtools import auto_process_form_insert
该foobar.formtools
模块包含以下行:
from foobar.webserver import redirect, redirect_back
当然,两者都分别导致以下错误:
ImportError:无法导入名称auto_process_form_insert
ImportError:无法导入名称重定向
难道仅仅是一个事实,在Python中,两个模块不能互相导入,并且所有模块的导入本质上必须是分层的,还是我做错了什么?另外,是否有一种解决方法,不能将所有这些好的功能都放在新模块中?
模块 可以 周期性地相互导入,但是有一个陷阱。在简单的情况下,它应该通过将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
。现在,该模块包含webbrowser
和open_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
。Pythonopen_example
在中找不到example_opener
,因此失败。
如果我们进口open_example
从结束webbrowser
和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
在中sys.modules
,因此它使用了它。example_opener
包含open_example
,因此成功。Python完成导入webbrowser
。结束webbrowser
从的导入example_opener
。这是中的最后一件事example_opener
,因此,example_opener
完成的导入也很成功。
问题内容: 我有几个Docker容器,还有一个特例,其中两个必须互相交谈,因此它们必须通过链接最多彼此了解。我可以将一个容器链接到另一个容器,但是问题是,我不能告诉他们第二个容器可以与第一个容器对话。 我尝试创建并运行第一个容器并将其停止,然后创建了第二个容器并同时将其停止。接下来,我再次启动了第一个容器并链接到第二个容器,并启动了第二个容器并链接到第一个容器。此后,我的机器发疯了,docker进
问题内容: 我要两个紧挨着。右边大约200px;并且左侧必须填满屏幕的其余宽度?我怎样才能做到这一点? 问题答案: 您可以使用 flexbox 布置物品: 这基本上只是刮擦flexbox的表面。Flexbox可以做很多令人惊奇的事情。 对于较旧的浏览器支持,可以使用CSS float 和 width 属性来解决它。
问题内容: 我有2个这样的Int类型的数组 我想添加每个数组的元素,例如arrayFirst [0] + arraySecond [0],arrayFirst [1] + arraySecond [1]等,然后将其分配给另一个数组,因此数组的结果将类似于 [5、7、24、29] 什么是实现这一目标的最佳实践 问题答案: 您可以像这样添加两个数组
一、内容模块 内容模块PC标签调用说明 模块名:content 模块提供的可用操作 操作名 说明 lists 内容数据列表 relation 内容相关文章 hits 内容数据点击排行榜 category 内容栏目列表 position 内容推荐位列表 1.position操作说明如下: 内容推荐位列表(position): 可用参数: 参数名 是否必须 默认值 说明 posid 是 null 推荐
问题内容: 我想让我的两个python文件互相导入一些方法。这似乎给了我导入错误。 例: file_A.py: file_B.py: 我之所以这样做,是因为我想以一种对我来说直观的方式来组织项目,而不是按照对编译器有意义的方式来组织项目。 有没有办法做到这一点? 谢谢! 问题答案: 不要在其他模块中直接使用名称。 file_A.py file_B.py
问题内容: 是否有类似于“不等于”的方法? 我要完成的示例如下: 我试图找到不需要我使用的东西。 问题答案: 只需输入一个“!” 在布尔表达式前面