Hub*_*bro 54 python python-module
我有一个Bottle webserver模块,其中包含以下行:
from foobar.formtools import auto_process_form_insert
Run Code Online (Sandbox Code Playgroud)
该foobar.formtools
模块包含以下行:
from foobar.webserver import redirect, redirect_back
Run Code Online (Sandbox Code Playgroud)
当然,两者都会导致以下错误:
ImportError:无法导入名称auto_process_form_insert
ImportError:无法导入名称重定向
事实上,在Python中,两个模块不能互相导入,并且所有模块导入必须是分层的,或者我做错了什么?或者,是否有一种解决方法是将所有这些不错的功能放在新模块中?
ick*_*fay 65
模块可以周期性地相互导入,但是有一个问题.在简单的情况下,它应该通过将import
语句移动到文件的底部或不使用from
语法来工作.
这就是为什么有效:
导入模块时,Python首先检查sys.modules
.如果它在那里,它只是从那里进口.如果它不存在,它会尝试以正常方式导入它; 基本上,它找到文件并运行其中的东西.
运行模块会填充模块的内容.例如,假设我们有这个模块,创造性地命名为example_opener
:
import webbrowser
def open_example():
webbrowser.open('http://www.example.com/')
Run Code Online (Sandbox Code Playgroud)
一开始,模块为空.然后Python执行:
import webbrowser
Run Code Online (Sandbox Code Playgroud)
之后,模块只包含webbrowser
.然后Python执行:
def open_example():
webbrowser.open('http://www.example.com/')
Run Code Online (Sandbox Code Playgroud)
Python创建open_example
.现在该模块包含webbrowser
和open_example
.
说webbrowser
包含这个代码:
from example_opener import open_example
def open(url):
print url
Run Code Online (Sandbox Code Playgroud)
说example_opener
先导入.执行此代码:
import webbrowser
Run Code Online (Sandbox Code Playgroud)
webbrowser
尚未导入,因此Python执行以下内容webbrowser
:
from example_opener import open_example
Run Code Online (Sandbox Code Playgroud)
example_opener
有被导入,但尚未完全执行.Python并不关心.Python将模块拉出来sys.modules
.此时,example_opener
仍然是空的.它还没有定义open_example
,甚至没有完成导入webbrowser
.Python不能找到open_example
的example_opener
,所以它失败.
如果我们进口open_example
从结束webbrowser
和webbrowser
从结束example_opener
?Python将从执行此代码开始:
def open_example():
webbrowser.open('http://www.example.com/')
Run Code Online (Sandbox Code Playgroud)
webbrowser
还不存在,但直到open_example
被调用才无所谓.现在example_opener
只包含open_example
.然后它执行:
import webbrowser
Run Code Online (Sandbox Code Playgroud)
它还没有导入,所以Python执行webbrowser
.开始:
def open(url):
print url
Run Code Online (Sandbox Code Playgroud)
它定义了open
.然后它执行:
from example_opener import open_example
Run Code Online (Sandbox Code Playgroud)
example_opener
是的sys.modules
,所以它使用它.example_opener
包含open_example
,所以它成功了.Python完成导入webbrowser
.这就是webbrowser
从中导入的结论example_opener
.这是最后一件事example_opener
,因此example_opener
成品的导入也是成功的.
pyr*_*ade 21
不要这样做from ... import ...
.只需import ...
使用模块名称引用其对象即可.
归档时间: |
|
查看次数: |
28680 次 |
最近记录: |