python的查找器
一、元路徑查找器(metapathfinder)
元路徑查找器的工作就是看是否能找到模塊。這些查找器存放在sys.meta_path中以供Python遍歷(當(dāng)然它們也可以通過import勾子返回,參見上面的例子)。每個(gè)查找器必須實(shí)現(xiàn)find_spec方法。如果一個(gè)查找器知道怎么處理將引入的模塊,find_spec將返回一個(gè)ModuleSpec對(duì)象(參見下節(jié))否則返回None。
和之前提到的一樣sys.meta_path包含三種查找器:
內(nèi)置模塊查找器
凍結(jié)模塊查找器
基于路徑的查找器
這里我們想重點(diǎn)聊一聊基于路徑的查找器(pathbasedfinder)。它用于搜索一系列import路徑,每個(gè)路徑都用來查找是否有對(duì)應(yīng)的模塊可以加載。默認(rèn)的路徑查找器實(shí)現(xiàn)了所有在文件系統(tǒng)的特殊文件中查找模塊的功能,這些特殊文件包括Python源文件(.py文件),Python編譯后代碼文件(.pyc文件),共享庫文件(.so文件)。如果Python標(biāo)準(zhǔn)庫中包含zipimport,那么相關(guān)的文件也可用來查找可引入的模塊。
路徑查找器不僅限于文件系統(tǒng)中的文件,它還可以上URL數(shù)據(jù)庫的查詢,或者其他任何可以用字符串表示的地址。
你可以用上節(jié)提供的勾子來實(shí)現(xiàn)對(duì)同類型地址的模塊查找。例如,如果你想通過URL來import模塊,那么你可以寫一個(gè)import勾子來解析這個(gè)URL并且返回一個(gè)路徑查找器。
注意,路徑查找器不同于元路徑查找器。后者在sys.meta_path中用于被Python遍歷,而前者特指基于路徑的查找器。
二、ModuleSpec對(duì)象
每個(gè)元路徑查找器必須實(shí)現(xiàn)find_spec方法,如果該查找器知道如果處理要引入的模塊,那么這個(gè)方法將返回一個(gè)ModuleSpec對(duì)象。這個(gè)對(duì)象有兩個(gè)屬性值得一提,一個(gè)是模塊的名字,而另一個(gè)則是查找器。如果一個(gè)ModuleSpec對(duì)象的查找器是None,那么類似ImportError:missingloader的異常將會(huì)被拋出。查找器將用來創(chuàng)建和執(zhí)行一個(gè)模塊(見下節(jié))。
你可以通過.__spec__來查找模塊的ModuleSpec對(duì)象:
In[1]:importsys
In[2]:sys.__spec__
Out[2]:ModuleSpec(name='sys',loader=)
三、加載器(loader)
加載器通過create_module來創(chuàng)建模塊以及exec_module來執(zhí)行模塊。通常如果一個(gè)模塊是一個(gè)Python模塊(非內(nèi)置模塊或者動(dòng)態(tài)擴(kuò)展),那么該模塊的代碼需要在模塊的__dict__空間上執(zhí)行。如果模塊的代碼無法執(zhí)行,那么就會(huì)拋出ImportError異常,或者其他在執(zhí)行過程中的異常也會(huì)被拋出。
絕大多數(shù)情況下,查找器和加載器是同一個(gè)東西。這種情況下,查找器的find_spec方法返回的ModuleSpec對(duì)象的loader屬性將指向它自己。
我們可以用create_module來動(dòng)態(tài)創(chuàng)建一個(gè)模塊,如果它返回NonePython會(huì)自動(dòng)創(chuàng)建一個(gè)模塊。
以上內(nèi)容為大家介紹了python的查找器,希望對(duì)大家有所幫助,如果想要了解更多Python相關(guān)知識(shí),請(qǐng)關(guān)注IT培訓(xùn)機(jī)構(gòu):千鋒教育。

猜你喜歡LIKE
相關(guān)推薦HOT
更多>>
python中的filter函數(shù)功能是什么?
python中的filter函數(shù)功能是什么?在python中,面對(duì)眾多的數(shù)據(jù),我們要過濾篩選出我們需要的數(shù)據(jù)。python中的filter函數(shù)就是起到了過濾篩選的作...詳情>>
2023-11-10 20:37:27
pythontime模塊是什么
pythontime模塊是什么在python中使用時(shí)間,就免不了和time模塊打交道,另外兩個(gè)模塊這個(gè)暫時(shí)先不做介紹。做time模塊的使用上,我們可以用它來對(duì)...詳情>>
2023-11-10 15:53:16
python是什么編程語言
python是什么編程語言1、說明是一種面向?qū)ο蟆⒔忉屝陀?jì)算機(jī)程序設(shè)計(jì)語言,由GuidovanRossum于1989年底發(fā)明,第一個(gè)公開發(fā)行版發(fā)行于1991年。Pyt...詳情>>
2023-11-10 15:21:05
python異常處理的兩種技巧
python異常處理的兩種技巧1、傳遞異常有時(shí)我們會(huì)在捕捉到一個(gè)異常后重新引發(fā)它(傳遞異常),實(shí)現(xiàn)起來很簡(jiǎn)單,使用不帶參數(shù)的raise語句即可。deff...詳情>>
2023-11-10 14:49:39熱門推薦
python中的filter函數(shù)功能是什么?
沸python delattr函數(shù)如何使用?
熱python中pdb模塊怎么用?
熱Python如何截圖保存?
新python?中缺少module怎么辦?
python strftime和strptime的不同分析
python time.strptime的格式化
python中@contextmanager是什么?
python對(duì)象的三要素是什么
pythonGIL在Python多線程的應(yīng)用
python如何對(duì)多個(gè)CSV文件進(jìn)行讀取
pythonif嵌套命令如何理解?
python對(duì)列表進(jìn)行永久性或臨時(shí)排序的方法
python生成器調(diào)用方法引發(fā)異常
技術(shù)干貨







快速通道 更多>>
-
課程介紹
點(diǎn)擊獲取大綱 -
就業(yè)前景
查看就業(yè)薪資 -
學(xué)習(xí)費(fèi)用
了解課程價(jià)格 -
優(yōu)惠活動(dòng)
領(lǐng)取優(yōu)惠券 -
學(xué)習(xí)資源
領(lǐng)3000G教程 -
師資團(tuán)隊(duì)
了解師資團(tuán)隊(duì) -
實(shí)戰(zhàn)項(xiàng)目
獲取項(xiàng)目源碼 -
開班地區(qū)
查看來校路線