<span id="mktg5"></span>

<i id="mktg5"><meter id="mktg5"></meter></i>

        <label id="mktg5"><meter id="mktg5"></meter></label>
        最新文章專題視頻專題問答1問答10問答100問答1000問答2000關鍵字專題1關鍵字專題50關鍵字專題500關鍵字專題1500TAG最新視頻文章推薦1 推薦3 推薦5 推薦7 推薦9 推薦11 推薦13 推薦15 推薦17 推薦19 推薦21 推薦23 推薦25 推薦27 推薦29 推薦31 推薦33 推薦35 推薦37視頻文章20視頻文章30視頻文章40視頻文章50視頻文章60 視頻文章70視頻文章80視頻文章90視頻文章100視頻文章120視頻文章140 視頻2關鍵字專題關鍵字專題tag2tag3文章專題文章專題2文章索引1文章索引2文章索引3文章索引4文章索引5123456789101112131415文章專題3
        問答文章1 問答文章501 問答文章1001 問答文章1501 問答文章2001 問答文章2501 問答文章3001 問答文章3501 問答文章4001 問答文章4501 問答文章5001 問答文章5501 問答文章6001 問答文章6501 問答文章7001 問答文章7501 問答文章8001 問答文章8501 問答文章9001 問答文章9501
        當前位置: 首頁 - 科技 - 知識百科 - 正文

        python中import學習備忘筆記

        來源:懂視網 責編:小采 時間:2020-11-27 14:26:52
        文檔

        python中import學習備忘筆記

        python中import學習備忘筆記:前言在python的模塊有兩種組織方式,一種是單純的python文件,文件名就是模塊名,一種是包,包是一個包含了若干python文件的目錄,目錄下必須有一個文件__init__.py,這樣目錄名字就是模塊名,包里的python文件也可以通過包名.文件名的方式importim
        推薦度:
        導讀python中import學習備忘筆記:前言在python的模塊有兩種組織方式,一種是單純的python文件,文件名就是模塊名,一種是包,包是一個包含了若干python文件的目錄,目錄下必須有一個文件__init__.py,這樣目錄名字就是模塊名,包里的python文件也可以通過包名.文件名的方式importim

        前言

        在python的模塊有兩種組織方式,一種是單純的python文件,文件名就是模塊名,一種是包,包是一個包含了若干python文件的目錄,目錄下必須有一個文件__init__.py,這樣目錄名字就是模塊名,包里的python文件也可以通過包名.文件名的方式import

        import語法

        import語法有兩種

        1、直接import模塊

        import Module
        import Module as xx

        2、從模塊import對象(下級模塊,類,函數,變量等)

        from Module import Name
        from Module immport Name as yy

        as語法是用來設置對象(這里用對象泛指模塊,類,函數等等)別名,import將對象名字引入了當前文件的名字空間

        假設有如下目錄結構

        ├── A.py
        └── pkg
         ├── B.py
         └── __init__.py

        在當前目錄下,以下語句都是有效的

        import A
        import pkg
        import pkg.B
        from pkg import B

        為了簡化討論,下面將不會對as語法進行舉例

        import步驟

        python所有加載的模塊信息都存放在sys.modules結構中,當import一個模塊時,會按如下步驟來進行

        如果是import A,檢查sys.modules中是否已經有A,如果有則不加載,如果沒有則為A創建module對象,并加載A

        如果是from A import B,先為A創建module對象,再解析A,從中尋找B并填充到A的__dict__中

        嵌套import

        在import模塊時我們可能會擔心一個模塊會不會被import多次,假設有A,B,C三個模塊,A需要import B和C,B又要import C,這樣A會執行到兩次import C,一次是自己本身import,一次是在import B時執行的import,但根據上面講到的import步驟,在第二次import時發現模塊已經被加載,所以不會重復import

        但如下情況卻會報錯

        #filename: A.py
        from B import BB
        class AA:pass
         
        #filename: B.py
        from A import AA
        class BB:pass

        這時不管是執行A.py還是B.py都會拋出ImportError的異常,假設我們執行的是A.py,究其原因如下

        文件A.py執行from B import BB,會先掃描B.py,同時在A的名字空間中為B創建module對象,試圖從B中查找BB

        掃描B.py第一行執行from A import AA,此時又會去掃描A.py

        掃描A.py第一行執行from B import BB,由于步驟1已經為B創建module對象,所以會直接從B的module對象的__dict__中獲取BB,此時顯然BB是獲取不到的,于是拋出異常

        解決這種情況有兩種辦法,

        將from B import BB改為import B,或將from A import AA改為import A

        將A.py或B.py中的兩行代碼交換位置

        總之,import需要注意的是,盡量在需要用到時再import

        包的import

        當一個目錄下有__init__.py文件時,該目錄就是一個python的包

        import包和import單個文件是一樣的,我們可以這樣類比:

        import單個文件時,文件里的類,函數,變量都可以作為import的對象

        import包時,包里的子包,文件,以及__init__.py里的類,函數,變量都可以作為import的對象

        假設有如下目錄結構

        pkg
        ├── __init__.py
        └── file.py

        其中__init__.py內容如下

        argument = 0
        class A:pass

        在和pkg同級目錄下執行如下語句都是OK的

        >>> import pkg
        >>> import pkg.file
        >>> from pkg import file
        >>> from pkg import A
        >>> from pkg import argument

        但如下語句是錯誤的

        >>> import pkg.A
        >>> import pkg.argument

        報錯ImportError: No module named xxx,因為當我們執行import A.B,A和B都必須是模塊(文件或包)

        相對導入和絕對導入

        絕對導入的格式為import A.B或from A import B,相對導入格式為from . import B或from ..A import B,.代表當前模塊,..代表上層模塊,...代表上上層模塊,依次類推。當我們有多個包時,就可能有需求從一個包import另一個包的內容,這就會產生絕對導入,而這也往往是最容易發生錯誤的時候,還是以具體例子來說明

        目錄結構如下

        app
        ├── __inti__.py
        ├── mod1
        │ ├── file1.py
        │ └── __init__.py
        ├── mod2
        │ ├── file2.py
        │ └── __init__.py
        └── start.py

        其中app/start.py內容為import mod1.file1

        app/mod1/file1.py內容為from ..mod2 import file2

        為了便于分析,我們在所有py文件(包括__init__.py)第一行加入print __file__, __name__

        現在app/mod1/file1.py里用到了相對導入,我們在app/mod1下執行python file1.py或者在app下執行python mod1/file1.py都會報錯ValueError: Attempted relative import in non-package

        在app下執行python -m mod1.file1或python start.py都會報錯ValueError: Attempted relative import beyond toplevel package

        具體原因后面再說,我們先來看一下導入模塊時的一些規則

        在沒有明確指定包結構的情況下,python是根據__name__來決定一個模塊在包中的結構的,如果是__main__則它本身是頂層模塊,沒有包結構,如果是A.B.C結構,那么頂層模塊是A。

        基本上遵循這樣的原則

        如果是絕對導入,一個模塊只能導入自身的子模塊或和它的頂層模塊同級別的模塊及其子模塊

        如果是相對導入,一個模塊必須有包結構且只能導入它的頂層模塊內部的模塊

        有目錄結構如下

        A
        ├── B1
        │ ├── C1
        │ │ └── file.py
        │ └── C2
        └── B2

        其中A,B1,B2,C1,C2都為包,這里為了展示簡單沒有列出__init__.py文件,當file.py的包結構為A.B1.C1.file(注意,是根據__name__來的,而不是磁盤的目錄結構,在不同目錄下執行file.py時對應的包目錄結構都是不一樣的)時,在file.py中可采用如下的絕對的導入

        import A.B1.C2
        import A.B2

        和如下的相對導入

        from .. import C2
        from ... import B2

        什么情況下會讓file.py的包結構為A.B1.C1.file呢,有如下兩種

        在A的上層目錄執行python -m A.B1.C1.file, 此時明確指定了包結構

        在A的上層目錄建立文件start.py,在start.py里有import A.B1.C1.file,然后執行python start.py,此時包結構是根據file.py的__name__變量來的

        再看前面出錯的兩種情況,第一種執行python file1.py和python mod1/file1.py,此時file.py的__name__為__main__ ,也就是說它本身就是頂層模塊,并沒有包結構,所以會報錯

        第二種情況,在執行python -m mod1.file1和python start.py時,前者明確告訴解釋器mod1是頂層模塊,后者需要導入file1,而file1.py的__name__為mod1.file1,頂層模塊為也mod1,所以在file1.py中執行from ..mod2 import file2時會報錯 ,因為mod2并不在頂層模塊mod1內部。通過錯誤堆棧可以看出,并不是在start.py中絕對導入時報錯,而是在file1.py中相對導入報的錯

        那么如何才能偶正確執行呢,有兩種方法,一種是在app上層目錄執行python -m app.mod1.file1,另一種是改變目錄結構,將所有包放在一個大包中,如下

         
        app
        ├── pkg
        │ ├── __init__.py
        │ ├── mod1
        │ │ ├── __init__.py
        │ │ └── file1.py
        │ └── mod2
        │ ├── __init__.py
        │ └── file2.py
        └── start.py

        start.py內容改成import pkg.mod1.file1,然后在app下執行python start.py

        總結

        聲明:本網頁內容旨在傳播知識,若有侵權等問題請及時與本網聯系,我們將在第一時間刪除處理。TEL:177 7030 7066 E-MAIL:11247931@qq.com

        文檔

        python中import學習備忘筆記

        python中import學習備忘筆記:前言在python的模塊有兩種組織方式,一種是單純的python文件,文件名就是模塊名,一種是包,包是一個包含了若干python文件的目錄,目錄下必須有一個文件__init__.py,這樣目錄名字就是模塊名,包里的python文件也可以通過包名.文件名的方式importim
        推薦度:
        • 熱門焦點

        最新推薦

        猜你喜歡

        熱門推薦

        專題
        Top
        主站蜘蛛池模板: 波多野结衣免费在线| 免费高清在线爱做视频| 成人免费午夜视频| 亚洲精品tv久久久久久久久久| 亚洲AV人无码激艳猛片| 亚洲性色AV日韩在线观看| 一区二区三区无码视频免费福利| 噼里啪啦电影在线观看免费高清| 国产国拍亚洲精品福利| 亚洲欧洲日本精品| 四虎成人精品国产永久免费无码| 2021国内精品久久久久精免费| 男人的天堂亚洲一区二区三区| 亚洲av午夜成人片精品网站| 亚洲AV无码成人精品区日韩| 中文无码成人免费视频在线观看| 日韩精品免费电影| 亚洲日本va午夜中文字幕一区| 国产亚洲福利一区二区免费看| 91香蕉国产线观看免费全集| 亚洲欧洲久久久精品| 亚洲av无码一区二区三区观看| 三级毛片在线免费观看| 成年女人免费视频播放体验区| 亚洲成a人片在线观看无码专区| 国产精品国产亚洲区艳妇糸列短篇 | 亚洲国产无线乱码在线观看| 精品国产麻豆免费人成网站| 国产精品冒白浆免费视频 | 亚洲视频小说图片| a一级爱做片免费| 午夜视频免费成人| 亚洲精品第五页中文字幕| 99久久99这里只有免费的精品| 国产精品成人无码免费| avtt天堂网手机版亚洲| 一级毛片aaaaaa免费看| 综合亚洲伊人午夜网| 粉色视频成年免费人15次| 最近最新中文字幕完整版免费高清 | 9i9精品国产免费久久|