【Python】Python这种情况为何不会出现循环引用?

Flask项目,项目结构如下:

【Python】Python这种情况为何不会出现循环引用?

app/__init__.py中使用from app.home import home as home_blueprint引入home


home/__init__.py中的代码如下:

from flask import Blueprint

home = 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__.pyimport的吧?而home/__init__.py结尾又用import app.home.viewsviews.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.viewsviews.py 导入内容。同样会把 views 的包名及路径,保存到 sys.modules 中,并将将views 这个包名引入到 home 这个模块的 Local 命名空间。

提示: 一个模块不会重复导入。

到此,一切看似都还正常。

4、但是,重点是 views 里还需要导入蓝图 home,这很明显就是循环导入的问题了。记住,循环导入问题 是个真正的问题,会导致 ModuleNotFoundError: No module named 错误。但是循环导入是可以破解的,那就是写在 home/__init__.py 文本内容的最后面。
5、如果写在前面呢?? home/__init__.pyhome = Blueprint('home', __name__) 就是在定义 home 这个包,在你没有定义完成之前,涉及到调用 home 本身,肯定会报错。所以,写在之前或之后的问题就是以蓝图创建的代码 home = Blueprint('home', __name__) 为基准。

以上是 【Python】Python这种情况为何不会出现循环引用? 的全部内容, 来源链接: utcz.com/a/80024.html

回到顶部