当前位置: 首页 > 面试题库 >

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

松铭
2023-03-14
问题内容

我有一个带有以下行的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。现在,该模块包含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。Pythonopen_example在中找不到example_opener,因此失败。

如果我们进口open_example从结束webbrowserwebbrowser从结束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

  • 问题内容: 是否有类似于“不等于”的方法? 我要完成的示例如下: 我试图找到不需要我使用的东西。 问题答案: 只需输入一个“!” 在布尔表达式前面