中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

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

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

Python模塊導入機制與大型項目的規范是什么

發布時間:2020-10-12 14:38:35 來源:億速云 閱讀:198 作者:小新 欄目:編程語言

這篇文章主要介紹Python模塊導入機制與大型項目的規范是什么,文中介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們一定要看完!

Python模塊導入

日常編程中,為了能夠復用寫過的代碼邏輯,我們都會把這些代碼封裝成為模塊,需要用到的時候可以直接導入復用,以便提高我們的開發效率。 module能定義函數、類、變量,也能包含可執行的代碼。module來源有3種: ①Python內置的模塊(標準庫); ②第三方模塊; ③自定義模塊;

導入原理

模塊的導入一般是在文件頭使用import關鍵字,import一個模塊相當于先執行了一次這個被導入模塊,然后在本命名空間建立一個與被導入模塊命名空間的聯系,相當于在本命名空間新建了一個變量,這個變量名稱是被導入模塊的名稱,指向被導入模塊的命名空間。所以導入的這個模塊相當于一個變量,因此多次導入同一個模塊只有第一次導入的時候會被執行(后續導入會判斷到這個模塊變量已存在所以不執行)

Python模塊導入機制與大型項目的規范是什么

路徑查找機制

每一個導入的模塊都會在Python內置字典sys.modules中,Python一啟動,它將被加載在內存中,當我們導入新modules,sys.modules將自動記錄下該module。 Python的模塊查找路徑的機制是:

  1. 查找sys.path中的所有路徑下是否有該模塊,有則開辟新空間加載該模塊;
  2. 查看sys.modules中是否有內置包或已安裝的第三方包,有則開辟新空間加載該模塊;

所以對于我們自己編寫的模塊,如果封裝并發布到了PyPi,則可以用pip install直接安裝,并在啟動時加載在內存中,通過sys.modules可以查看到 而對于僅需要在本項目中復用的模塊,我們在復用代碼中將其路徑加入到sys.path中,同樣可以引用到該模塊。

絕對路徑導入

所有的模塊import都從“根節點”開始。根節點的位置由sys.path中的路徑決定,項目的根目錄一般自動在sys.path中。如果希望程序能處處執行,需手動修改sys.path

import sys,os
BASE_DIR = os.path.dirname(os.path.abspath(__file__))#項目根目錄所在的絕對路徑sys.path.append(BASE_DIR)import A, B #導入A、B包復制代碼

相對路徑導入

只關心相對自己當前目錄的模塊位置就好。不能在包(package)的內部直接執行(會報錯)。不管根節點在哪兒,包內的模塊相對位置都是正確的。

#from . import b2 #這種導入方式會報錯,只有在包內部直接執行的時候才可以這樣導入。import b2#正確b2.print_b2()復制代碼

Python模塊導入常見問題

  • 單獨import某個包名稱時,不會導入該包中所包含的所有子模塊 解決辦法:導入的包中也包含了其他包的導入,此時需要在每個包的init.py文件中導入該包下的所有模塊,最上層才可以直接引用最下層的包的類和方法

init文件

當一個文件夾下有init.py時,意為該文件夾是一個包(package),其下的多個模塊(module)構成一個整體,而這些模塊(module)都可通過同一個包(package)導入其他代碼中。 其中init.py文件 用于組織包(package),方便管理各個模塊之間的引用、控制著包的導入行為。

該文件可以什么內容都不寫,即為空文件(為空時,僅僅用import [該包]形式 是什么也做不了的),存在即可,相當于一個標記。

在python3中,即使包下沒有init.py文件,import 包仍然不會報錯,而在python2中,包下一定要有該文件,否則import 包會報錯

all變量

all 是一個重要的變量,用來指定此包(package)被import *時,哪些模塊(module)會被import進【當前作用域中】。不在all列表中的模塊不會被其他程序引用。可以重寫all,如 all= [‘當前所屬包模塊1名字’, ‘模塊1名字’],如果寫了這個,則會按列表中的模塊名進行導入

name變量

在包內部直接運行時,包的name == 'main',但是在外部導入包是,可以通過

if __name__ == '__main__':復制代碼

來避免實現包內部調試時的邏輯

循環導入

當兩個模塊A和B之間相互import時,就會出現循環導入的問題,此時程序運行會報錯:can not import name xxx,如:

# a.pyprint('from a.py')from b import x

y = 'a'復制代碼
# b.pyprint('from b.py')from a import y

x = 'b'復制代碼

我們來分析一下這種錯誤是怎么出現的:

  1. 在sys.modules中查找 符號“module b”;
  2. 如果符號“module b”存在,則獲得符號“module b”對應的module對象; 從的dict中獲得 符號“x”對應的對象。如果“x”不存在,則拋出異常“ImportError: cannot import name ‘x’”
  3. 如果符號“module b”不存在,則創建一個新的 module對象。不過此時該新module對象的dict為空。然后執行module b.py文件中的語句,填充的dict

因此在a.py中執行from b import x的順序就是1->3,先引入b,b里面from a import y由相當于執行了a.py,順序是1->2,因為此時b已經引入所以不會執行3,2中無法找到x對象,因為引入b時還沒執行到x='b'這一步,所以報錯了

解決辦法

  1. 延遲導入,把import語句寫在方法/函數里,將它的作用域限制在局部;
  2. 頂層先引入模塊,再把from x import y改成import x.y形式;
  3. 其實出現循環引用問題的根本原因是程序設計不合理,每個包都應該由上層使用的模塊去導入,而不應該在包與包之間各種相互導入,所以應該更改代碼布局,可合并或分離競爭資源;

大型項目中Python模塊導入規范

分離模塊,將同一類別的模塊放在同一目錄下,形成類別分明的目錄架構,如:

Python模塊導入機制與大型項目的規范是什么

  1. 每一個模塊目錄都要寫init.py文件,可以同時定義all限定可導入的范圍;
  2. 源碼根目錄可以定義BASE_DIR,限定好根目錄路徑,啟動py文件可以用絕對路徑導入各個模塊,將必要模塊都加入到sys.path中;
  3. 各個服務之間(例如model需要引入common的模塊方法),可以通過相對路徑引用模塊;
  4. 程序設計時避免循環導入,可由調用者(服務文件)作為上層第三方引入需要的各個模塊,這樣就可以減少各個模塊的相互導入。

以上是Python模塊導入機制與大型項目的規范是什么的所有內容,感謝各位的閱讀!希望分享的內容對大家有幫助,更多相關知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

军事| 巨鹿县| 繁昌县| 远安县| 淅川县| 兴业县| 达孜县| 仁化县| 商丘市| 乌兰察布市| 潞西市| 望城县| 西藏| 衡山县| 南涧| 胶州市| 平凉市| 沁源县| 遂平县| 德庆县| 康保县| 海南省| 通许县| 石城县| 邳州市| 南阳市| 盐山县| 汉沽区| 景谷| 高陵县| 巴青县| 哈密市| 合作市| 博乐市| 鄂州市| 霞浦县| 中西区| 墨竹工卡县| 云浮市| 临邑县| 孟连|