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

Flask项目,项目结构如下:

clipboard.png

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导入内容,这样不会产生循环引用吗?

阅读 2.7k
1 个回答

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__) 为基准。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题