【Python】Python这种情况为何不会出现循环引用?
Flask
项目,项目结构如下:
app/__init__.py
中使用from app.home import home as home_blueprint
引入home
;
home/__init__.py
中的代码如下:
from flask import Blueprinthome = Blueprint('home', __name__)
import app.home.views
而app/home/views.py
中的代码如下:
from . import home@home.route('/')
def index():
return 'Home Page'
开头的from . import home
是从home/__init__.py
中import
的吧?而home/__init__.py
结尾又用import app.home.views
从views.py
导入内容,这样不会产生循环引用吗?
回答
1、这是 flask 项目,我们可以明确一点,所有的模块操作都是在当前的操作目录下进行的,也就是说,导入模块的时候,不会涉及到 sys.__path__
。
2、所有的模块导入,都是为了载入内存,那么在载入内存在前,我们 Python 会将要导入的模块都加入到 sys.modules
这个字典中,并将模块的名字都加入正在调用 import 的模块的 Local 命名空间。
3、我们复盘一下 flask 项目中的包/模块导入。
3.1、app/__init__.py中使用 from app.home import home as home_blueprint
引入 home
,这里的动作是,将 home
这个包名及路径,保存到 sys.modules
这个字典中,并将home
这个包名引入到 app
这个模块的 Local 命名空间了。
3.2、home/__init__.py
结尾又用 import app.home.views
从 views.py
导入内容。同样会把 views
的包名及路径,保存到 sys.modules
中,并将将views
这个包名引入到 home
这个模块的 Local 命名空间。
提示:
一个模块不会重复导入。
到此,一切看似都还正常。
4、但是,重点是 views
里还需要导入蓝图 home
,这很明显就是循环导入的问题了。记住,循环导入问题 是个真正的问题,会导致 ModuleNotFoundError: No module named
错误。但是循环导入是可以破解的,那就是写在 home/__init__.py
文本内容的最后面。
5、如果写在前面呢?? home/__init__.py
中 home = Blueprint('home', __name__)
就是在定义 home
这个包,在你没有定义完成之前,涉及到调用 home
本身,肯定会报错。所以,写在之前或之后的问题就是以蓝图创建的代码 home = Blueprint('home', __name__)
为基准。
以上是 【Python】Python这种情况为何不会出现循环引用? 的全部内容, 来源链接: utcz.com/a/80024.html