久久精品国产亚洲高清|精品日韩中文乱码在线|亚洲va中文字幕无码久|伊人久久综合狼伊人久久|亚洲不卡av不卡一区二区|精品久久久久久久蜜臀AV|国产精品19久久久久久不卡|国产男女猛烈视频在线观看麻豆

    1. <style id="76ofp"></style>

      <style id="76ofp"></style>
      <rt id="76ofp"></rt>
      <form id="76ofp"><optgroup id="76ofp"></optgroup></form>
      1. 千鋒教育-做有情懷、有良心、有品質(zhì)的職業(yè)教育機(jī)構(gòu)

        手機(jī)站
        千鋒教育

        千鋒學(xué)習(xí)站 | 隨時隨地免費(fèi)學(xué)

        千鋒教育

        掃一掃進(jìn)入千鋒手機(jī)站

        領(lǐng)取全套視頻
        千鋒教育

        關(guān)注千鋒學(xué)習(xí)站小程序
        隨時隨地免費(fèi)學(xué)習(xí)課程

        當(dāng)前位置:首頁  >  技術(shù)干貨  > Python 的 import 機(jī)制

        Python 的 import 機(jī)制

        來源:千鋒教育
        發(fā)布人:xqq
        時間: 2023-11-07 13:15:58 1699334158

        1.1什么是import機(jī)制?

        通常來講,在一段Python代碼中去執(zhí)行引用另一個模塊中的代碼,就需要使用Python的import機(jī)制。import語句是觸發(fā)import機(jī)制最常用的手段,但并不是唯一手段。

        importlib.import_module和__import__函數(shù)也可以用來引入其他模塊的代碼。

        1.2import是如何執(zhí)行的?

        import語句會執(zhí)行兩步操作:

        搜索需要引入的模塊

        將模塊的名字做為變量綁定到局部變量中

        搜索步驟實(shí)際上是通過__import__函數(shù)完成的,而其返回值則會作為變量被綁定到局部變量中。下面我們會詳細(xì)聊到__import__函數(shù)是如果運(yùn)作的。

        二、import機(jī)制概覽

        下圖是import機(jī)制的概覽圖。不難看出,當(dāng)import機(jī)制被觸發(fā)時,Python首先會去sys.modules中查找該模塊是否已經(jīng)被引入過,如果該模塊已經(jīng)被引入了,就直接調(diào)用它,否則再進(jìn)行下一步。這里sys.modules可以看做是一個緩存容器。值得注意的是,如果sys.modules中對應(yīng)的值是None那么就會拋出一個ModuleNotFoundError異常。下面是一個簡單的實(shí)驗(yàn):

        In[1]:importsys

        In[2]:sys.modules['os']=None

        In[3]:importos

        ---------------------------------------------------------------------------

        ModuleNotFoundErrorTraceback(mostrecentcalllast)

        in

        ---->1importos

        ModuleNotFoundError:importofoshalted;Noneinsys.modules

        如果在sys.modules找到了對應(yīng)的module,并且這個import是由import語句觸發(fā)的,那么下一步將對把對應(yīng)的變量綁定到局部變量中。

        如果沒有發(fā)現(xiàn)任何緩存,那么系統(tǒng)將進(jìn)行一個全新的import過程。在這個過程中Python將遍歷sys.meta_path來尋找是否有符合條件的元路徑查找器(metapathfinder)。sys.meta_path是一個存放元路徑查找器的列表。它有三個默認(rèn)的查找器:

        內(nèi)置模塊查找器

        凍結(jié)模塊(frozenmodule)查找器

        基于路徑的模塊查找器。

        In[1]:importsys

        In[2]:sys.meta_path

        Out[2]:

        [_frozen_importlib.BuiltinImporter,

        _frozen_importlib.FrozenImporter,

        _frozen_importlib_external.PathFinder]

        查找器的find_spec方法決定了該查找器是否能處理要引入的模塊并返回一個ModeuleSpec對象,這個對象包含了用來加載這個模塊的相關(guān)信息。如果沒有合適的ModuleSpec對象返回,那么系統(tǒng)將查看sys.meta_path的下一個元路徑查找器。如果遍歷sys.meta_path都沒有找到合適的元路徑查找器,將拋出ModuleNotFoundError。引入一個不存在的模塊就會發(fā)生這種情況,因?yàn)閟ys.meta_path中所有的查找器都無法處理這種情況:

        In[1]:importnosuchmodule

        ---------------------------------------------------------------------------

        ModuleNotFoundErrorTraceback(mostrecentcalllast)

        in

        ---->1importnosuchmodule

        ModuleNotFoundError:Nomodulenamed'nosuchmodule'

        但是,如果這個手動添加一個可以處理這個模塊的查找器,那么它也是可以被引入的:

        In[1]:importsys

        ...:

        ...:fromimportlib.abcimportMetaPathFinder

        ...:fromimportlib.machineryimportModuleSpec

        ...:

        ...:classNoSuchModuleFinder(MetaPathFinder):

        ...:deffind_spec(self,fullname,path,target=None):

        ...:returnModuleSpec('nosuchmodule',None)

        ...:

        ...:#don'tdothisinyourscript

        ...:sys.meta_path=[NoSuchModuleFinder()]

        ...:

        ...:importnosuchmodule

        ---------------------------------------------------------------------------

        ImportErrorTraceback(mostrecentcalllast)

        in

        11sys.meta_path=[NoSuchModuleFinder()]

        12

        --->13importnosuchmodule

        ImportError:missingloader

        可以看到,當(dāng)我們告訴系統(tǒng)如何去find_spec的時候,是不會拋出ModuleNotFound異常的。但是要成功加載一個模塊,還需要加載器loader。

        加載器是ModuleSpec對象的一個屬性,它決定了如何加載和執(zhí)行一個模塊。如果說ModuleSpec對象是“師父領(lǐng)進(jìn)門”的話,那么加載器就是“修行在個人”了。在加載器中,你完全可以決定如何來加載以及執(zhí)行一個模塊。這里的決定,不僅僅是加載和執(zhí)行模塊本身,你甚至可以修改一個模塊:

        In[1]:importsys

        ...:fromtypesimportModuleType

        ...:fromimportlib.machineryimportModuleSpec

        ...:fromimportlib.abcimportMetaPathFinder,Loader

        ...:

        ...:classModule(ModuleType):

        ...:def__init__(self,name):

        ...:self.x=1

        ...:self.name=name

        ...:

        ...:classExampleLoader(Loader):

        ...:defcreate_module(self,spec):

        ...:returnModule(spec.name)

        ...:

        ...:defexec_module(self,module):

        ...:module.y=2

        ...:

        ...:classExampleFinder(MetaPathFinder):

        ...:deffind_spec(self,fullname,path,target=None):

        ...:returnModuleSpec('module',ExampleLoader())

        ...:

        ...:sys.meta_path=[ExampleFinder()]

        In[2]:importmodule

        In[3]:module

        Out[3]:)>

        In[4]:module.x

        Out[4]:1

        In[5]:module.y

        Out[5]:2

        從上面的例子可以看到,一個加載器通常有兩個重要的方法create_module和exec_module需要實(shí)現(xiàn)。如果實(shí)現(xiàn)了exec_module方法,那么create_module則是必須的。如果這個import機(jī)制是由import語句發(fā)起的,那么create_module方法返回的模塊對象對應(yīng)的變量將會被綁定到當(dāng)前的局部變量中。如果一個模塊因此成功被加載了,那么它將被緩存到sys.modules。如果這個模塊再次被加載,那么sys.modules的緩存將會被直接引用。

        以上內(nèi)容為大家介紹了Python的import機(jī)制,希望對大家有所幫助,如果想要了解更多Python相關(guān)知識,請關(guān)注IT培訓(xùn)機(jī)構(gòu):千鋒教育。

        聲明:本站稿件版權(quán)均屬千鋒教育所有,未經(jīng)許可不得擅自轉(zhuǎn)載。
        10年以上業(yè)內(nèi)強(qiáng)師集結(jié),手把手帶你蛻變精英
        請您保持通訊暢通,專屬學(xué)習(xí)老師24小時內(nèi)將與您1V1溝通
        免費(fèi)領(lǐng)取
        今日已有369人領(lǐng)取成功
        劉同學(xué) 138****2860 剛剛成功領(lǐng)取
        王同學(xué) 131****2015 剛剛成功領(lǐng)取
        張同學(xué) 133****4652 剛剛成功領(lǐng)取
        李同學(xué) 135****8607 剛剛成功領(lǐng)取
        楊同學(xué) 132****5667 剛剛成功領(lǐng)取
        岳同學(xué) 134****6652 剛剛成功領(lǐng)取
        梁同學(xué) 157****2950 剛剛成功領(lǐng)取
        劉同學(xué) 189****1015 剛剛成功領(lǐng)取
        張同學(xué) 155****4678 剛剛成功領(lǐng)取
        鄒同學(xué) 139****2907 剛剛成功領(lǐng)取
        董同學(xué) 138****2867 剛剛成功領(lǐng)取
        周同學(xué) 136****3602 剛剛成功領(lǐng)取
        相關(guān)推薦HOT
        古蔺县| 晋城| 从江县| 泗洪县| 磴口县| 且末县| 连城县| 射洪县| 浦县| 昔阳县| 东辽县| 海南省| 会同县| 淮滨县| 邯郸县| 普陀区| 宁强县| 柘荣县| 铁力市| 肇庆市| 万年县| 勃利县| 托克逊县| 静海县| 延安市| 新沂市| 阿拉尔市| 安塞县| 铁岭县| 隆回县| 思茅市| 军事| 石棉县| 南宫市| 集贤县| 浦江县| 昌江| 常山县| 扬州市| 疏勒县| 绥化市|