您好,登錄后才能下訂單哦!
為什么Python的__import__需要fromlist,針對這個問題,這篇文章詳細介紹了相對應的分析和解答,希望可以幫助更多想解決這個問題的小伙伴找到更簡單易行的方法。
在Python中,如果要以動態方式導入模塊,可以執行以下操作:
module = __import__('module_name')
如果要導入子模塊,你可能認為這只是一個簡單的問題:
module = __import__('module_name.submodule')
結果呢,當然不起作用了,你必須這么做:
module = __import__('module_name.submodule', fromlist=['xxx'])
為什么?實際值fromlist似乎根本不重要,只要它不是空的就行。
實際上,__import__內部也是import來實現的。
那么我們在使用import的時候,一般有以下五種方式:
import pkg
import pkg.mod
from pkg import mod, mod2
from pkg.mod import func, func2
from pkg.mod import submod
在前兩種情況下,import語句將最左側模塊對象分配給了: pkg。之后的import pkg.mod
可以這樣使用pkg.mod.func()
,因為import語句引入了本地的模塊pkg,這是一個具有mod屬性的模塊對象。因此__import__函數必須返回最左側的模塊對象,以便將其分配給pkg。這兩種情況相當于
pkg = __import__('pkg')
pkg = __import__('pkg.mod')
后面三種情況,import就必須做更多的工作了,它必須從模塊對象獲取并分配多個名稱。但是__import__函數只能返回一個對象,并且它不能從模塊對象中檢索出多個名字,所以對于第三種情況就是:
pkg = __import__('pkg')
mod = pkg.mod
mod2 = pkg.mod2
但是如果mod和mod2在該模塊pkg中尚未導入,那將無法生效。__import__函數需要知道mod和mod2是它可以訪問的名稱,以便它可以查看他們是否是模塊并且嘗試導入他們。所以像一下這個方式更為接近:
pkg = __import__('pkg', fromlist=['mod', 'mod2'])
mod = pkg.mod
mod2 = pkg.mod2
這會導致__import__先嘗試pkg.mod和pkg.mod2,如果不生效的話,它并不會拋出異常。但是第五種例子按照以上方式依然不行:
tmp = __import__('pkg.mod', fromlist=['submod'])
submod = tmp.submod
我們希望tmp是pkg.mod模塊,但實際上它還是pkg模塊。如果是按照我們想的這種方式去加載,那就要增加更多額外的解包工作。所以它就直接返回了最右邊的模塊,當且僅當fromlist里面不是空的時候。
__import__函數中的fromlist實際上是沒有具體含義的,你可以理解為它只是一種標記,當它不為空的時候,import將為我們導入前面所寫的字符串中最右邊的模塊。當它為空的時候,import將為我們導入字符串最左邊的模塊,僅此而已。
關于為什么Python的__import__需要fromlist問題的解答就分享到這里了,希望以上內容可以對大家有一定的幫助,如果你還有很多疑惑沒有解開,可以關注億速云行業資訊頻道了解更多相關知識。
免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。