在线观看不卡亚洲电影_亚洲妓女99综合网_91青青青亚洲娱乐在线观看_日韩无码高清综合久久

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

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

Flask項(xiàng)目,項(xiàng)目結(jié)構(gòu)如下:

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'

開(kāi)頭的from . import home是從home/__init__.pyimport的吧?而home/__init__.py結(jié)尾又用import app.home.viewsviews.py導(dǎo)入內(nèi)容,這樣不會(huì)產(chǎn)生循環(huán)引用嗎?

回答
編輯回答
扯機(jī)薄

1、這是 flask 項(xiàng)目,我們可以明確一點(diǎn),所有的模塊操作都是在當(dāng)前的操作目錄下進(jìn)行的,也就是說(shuō),導(dǎo)入模塊的時(shí)候,不會(huì)涉及到 sys.__path__。
2、所有的模塊導(dǎo)入,都是為了載入內(nèi)存,那么在載入內(nèi)存在前,我們 Python 會(huì)將要導(dǎo)入的模塊都加入到 sys.modules 這個(gè)字典中,并將模塊的名字都加入正在調(diào)用 import 的模塊的 Local 命名空間。
3、我們復(fù)盤(pán)一下 flask 項(xiàng)目中的包/模塊導(dǎo)入。
3.1、app/__init__.py中使用 from app.home import home as home_blueprint 引入 home,這里的動(dòng)作是,將 home 這個(gè)包名及路徑,保存到 sys.modules 這個(gè)字典中,并將home 這個(gè)包名引入到 app 這個(gè)模塊的 Local 命名空間了。
3.2、home/__init__.py 結(jié)尾又用 import app.home.viewsviews.py 導(dǎo)入內(nèi)容。同樣會(huì)把 views 的包名及路徑,保存到 sys.modules 中,并將將views 這個(gè)包名引入到 home 這個(gè)模塊的 Local 命名空間。

提示: 一個(gè)模塊不會(huì)重復(fù)導(dǎo)入。

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

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

2017年4月14日 11:53