溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

為什么Python的__import__需要fromlist

發(fā)布時(shí)間:2021-10-19 09:35:05 來(lái)源:億速云 閱讀:262 作者:柒染 欄目:大數(shù)據(jù)

為什么Python的__import__需要fromlist,針對(duì)這個(gè)問題,這篇文章詳細(xì)介紹了相對(duì)應(yīng)的分析和解答,希望可以幫助更多想解決這個(gè)問題的小伙伴找到更簡(jiǎn)單易行的方法。

在Python中,如果要以動(dòng)態(tài)方式導(dǎo)入模塊,可以執(zhí)行以下操作:

module = __import__('module_name')
 

如果要導(dǎo)入子模塊,你可能認(rèn)為這只是一個(gè)簡(jiǎn)單的問題:

module = __import__('module_name.submodule')
 

結(jié)果呢,當(dāng)然不起作用了,你必須這么做:

module = __import__('module_name.submodule', fromlist=['xxx'])
 

為什么?實(shí)際值fromlist似乎根本不重要,只要它不是空的就行。

實(shí)際上,__import__內(nèi)部也是import來(lái)實(shí)現(xiàn)的。
那么我們?cè)谑褂胕mport的時(shí)候,一般有以下五種方式:

import pkg
import pkg.mod
from pkg import mod, mod2
from pkg.mod import func, func2
from pkg.mod import submod
 

在前兩種情況下,import語(yǔ)句將最左側(cè)模塊對(duì)象分配給了: pkg。之后的import pkg.mod可以這樣使用pkg.mod.func(),因?yàn)閕mport語(yǔ)句引入了本地的模塊pkg,這是一個(gè)具有mod屬性的模塊對(duì)象。因此__import__函數(shù)必須返回最左側(cè)的模塊對(duì)象,以便將其分配給pkg。這兩種情況相當(dāng)于

pkg = __import__('pkg')
pkg = __import__('pkg.mod')
 

后面三種情況,import就必須做更多的工作了,它必須從模塊對(duì)象獲取并分配多個(gè)名稱。但是__import__函數(shù)只能返回一個(gè)對(duì)象,并且它不能從模塊對(duì)象中檢索出多個(gè)名字,所以對(duì)于第三種情況就是:

pkg = __import__('pkg')
mod = pkg.mod
mod2 = pkg.mod2
 

但是如果mod和mod2在該模塊pkg中尚未導(dǎo)入,那將無(wú)法生效。__import__函數(shù)需要知道m(xù)od和mod2是它可以訪問的名稱,以便它可以查看他們是否是模塊并且嘗試導(dǎo)入他們。所以像一下這個(gè)方式更為接近:

pkg = __import__('pkg', fromlist=['mod', 'mod2'])
mod = pkg.mod
mod2 = pkg.mod2
 

這會(huì)導(dǎo)致__import__先嘗試pkg.mod和pkg.mod2,如果不生效的話,它并不會(huì)拋出異常。但是第五種例子按照以上方式依然不行:

tmp = __import__('pkg.mod', fromlist=['submod'])
submod = tmp.submod
 

我們希望tmp是pkg.mod模塊,但實(shí)際上它還是pkg模塊。如果是按照我們想的這種方式去加載,那就要增加更多額外的解包工作。所以它就直接返回了最右邊的模塊,當(dāng)且僅當(dāng)fromlist里面不是空的時(shí)候。

__import__函數(shù)中的fromlist實(shí)際上是沒有具體含義的,你可以理解為它只是一種標(biāo)記,當(dāng)它不為空的時(shí)候,import將為我們導(dǎo)入前面所寫的字符串中最右邊的模塊。當(dāng)它為空的時(shí)候,import將為我們導(dǎo)入字符串最左邊的模塊,僅此而已。

關(guān)于為什么Python的__import__需要fromlist問題的解答就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關(guān)注億速云行業(yè)資訊頻道了解更多相關(guān)知識(shí)。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI