鍍金池/ 問答/Python  HTML/ Python這種情況為何不會出現(xiàn)循環(huán)引用?

Python這種情況為何不會出現(xiàn)循環(huán)引用?

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導入內(nèi)容,這樣不會產(chǎn)生循環(huán)引用嗎?

回答
編輯回答
扯機薄

1、這是 flask 項目,我們可以明確一點,所有的模塊操作都是在當前的操作目錄下進行的,也就是說,導入模塊的時候,不會涉及到 sys.__path__。
2、所有的模塊導入,都是為了載入內(nèi)存,那么在載入內(nèi)存在前,我們 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 導入內(nèi)容。同樣會把 views 的包名及路徑,保存到 sys.modules 中,并將將views 這個包名引入到 home 這個模塊的 Local 命名空間。

提示: 一個模塊不會重復導入。

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

4、但是,重點是 views 里還需要導入藍圖 home,這很明顯就是循環(huán)導入的問題了。記住,循環(huán)導入問題 是個真正的問題,會導致 ModuleNotFoundError: No module named 錯誤。但是循環(huán)導入是可以破解的,那就是寫在 home/__init__.py 文本內(nèi)容的最后面。
5、如果寫在前面呢?? home/__init__.pyhome = Blueprint('home', __name__) 就是在定義 home 這個包,在你沒有定義完成之前,涉及到調用 home 本身,肯定會報錯。所以,寫在之前或之后的問題就是以藍圖創(chuàng)建的代碼 home = Blueprint('home', __name__) 為基準。

2017年4月14日 11:53