python大型專案開發規範_學習Python模組匯入機制與大型專案的規範
Python視訊教程欄目今天為大家介紹學習Python模組匯入機制與大型專案的規範。
前言
在我們平常工程裡使用Python的過程中,經常需要解決各個模組的匯入問題,而且也常常遇到引用路徑查詢不到、交叉匯入模組等等問題,故寫這篇文章,旨在講述Python的模組匯入機制和我們平時大型專案中應該遵循的模組匯入規範
Python模組匯入
日常程式設計中,為了能夠複用寫過的程式碼邏輯,我們都會把這些程式碼封裝成為模組,需要用到的時候可以直接匯入複用,以便提高我們的開發效率。
module能定義函式、類、變數,也能包含可執行的程式碼。module來源有3種:
①Python內建的模組(標準庫);
②第三方模組;
③自定義模組;
匯入原理
模組的匯入一般是在檔案頭使用import關鍵字,import一個模組相當於先執行了一次這個被匯入模組,然後在本名稱空間建立一個與被匯入模組名稱空間的聯絡,相當於在本名稱空間新建了一個變數,這個變數名稱是被匯入模組的名稱,指向被匯入模組的名稱空間。所以匯入的這個模組相當於一個變數,因此多次匯入同一個模組只有第一次匯入的時候會被執行(後續匯入會判斷到這個模組變數已存在所以不執行)
路徑查詢機制
每一個匯入的模組都會在Python內建字典sys.modules中,Python一啟動,它將被載入在記憶體中,當我們匯入新modules,sys.modules將自動記錄下該module。
Python的模組查詢路徑的機制是:查詢sys.path中的所有路徑下是否有該模組,有則開闢新空間載入該模組;
檢視sys.modules中是否有內建包或已安裝的第三方包,有則開闢新空間載入該模組;
所以對於我們自己編寫的模組,如果封裝併發布到了PyPi,則可以用pip install直接安裝,並在啟動時載入在記憶體中,通過sys.modules可以檢視到
而對於僅需要在本專案中複用的模組,我們在複用程式碼中將其路徑加入到sys.path中,同樣可以引用到該模組。
絕對路徑匯入
所有的模組import都從“根節點”開始。根節點的位置由sys.path中的路徑決定,專案的根目錄一般自動在sys.path中。如果希望程式能處處執行,需手動修改sys.pathimport 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'複製程式碼
我們來分析一下這種錯誤是怎麼出現的:在sys.modules中查詢 符號“module b”;
如果符號“module b”存在,則獲得符號“module b”對應的module物件;
從的dict中獲得 符號“x”對應的物件。如果“x”不存在,則丟擲異常“ImportError: cannot import name ‘x’”
如果符號“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'這一步,所以報錯了
解決辦法延遲匯入,把import語句寫在方法/函式裡,將它的作用域限制在區域性;
頂層先引入模組,再把from x import y改成import x.y形式;
其實出現迴圈引用問題的根本原因是程式設計不合理,每個包都應該由上層使用的模組去匯入,而不應該在包與包之間各種相互匯入,所以應該更改程式碼佈局,可合併或分離競爭資源;
大型專案中Python模組匯入規範
分離模組,將同一類別的模組放在同一目錄下,形成類別分明的目錄架構,如:
每一個模組目錄都要寫init.py檔案,可以同時定義all限定可匯入的範圍;
原始碼根目錄可以定義BASE_DIR,限定好根目錄路徑,啟動py檔案可以用絕對路徑匯入各個模組,將必要模組都加入到sys.path中;
各個服務之間(例如model需要引入common的模組方法),可以通過相對路徑引用模組;
程式設計時避免迴圈匯入,可由呼叫者(服務檔案)作為上層第三方引入需要的各個模組,這樣就可以減少各個模組的相互匯入。更多相關免費學習推薦:python視訊教程
相關文章
- 個人專案開發規範
- 前端規範之vue 專案規範前端Vue
- 專案規範筆記筆記
- 我的專案命名規範
- 專案開發過程中的管理規範
- python基礎1 - 多檔案專案和程式碼規範Python
- python-模組入門二(模組迴圈匯入,區分python檔案的兩種用途,模組搜尋路徑,軟體開發的目錄規範)Python
- 如何打造規範的開源專案workflow
- 專案中的 Git 使用規範Git
- 專案規範-git commit 配置GitMIT
- web前端基於vue的大型專案分模組開發Web前端Vue
- 開發流程規範機制
- 專案中的 Git 使用規範 [轉]Git
- 【Vue】vue專案目錄介紹 es6的匯入匯出語法 vue專案開發規範 Vue專案編寫步驟Vue
- SpringBoot 專案規範筆記.2021Spring Boot筆記
- 淺談專案程式碼規範
- 在大型專案開發上,Python 真是個“爛”語言!Python
- 在大型專案開發上,Python真是個“爛”語言!Python
- NodeJs專案開發中應用ESLint程式碼規範NodeJSEsLint
- Commonjs規範與模組化JS
- JB的測試之旅-專案流程規範
- 團隊專案的Git分支管理規範Git
- python大型專案_Python開源專案大集合:15個領域,181個專案 | 硬核乾貨Python
- ReactNative專案實踐編碼規範React
- 專案可以怎麼規範Git commit ?GitMIT
- 如何規範化專案管理,提升效率?專案管理
- 《專案經理指導手冊》規範篇5,任務規範
- 如何在大型專案中使用Git子模組開發Git
- 前端專案git操作命名規範和協作開發流程前端Git
- python到底適不適合大型專案呢?Python
- Pycharm匯入python專案PyCharmPython
- 軟體專案研發流程該怎麼規範
- 統一規範化專案的命名風格
- 如何為開發專案編寫規範的README檔案(windows),此文詳解Windows
- 前端工具類專案規範化-使用TS前端
- 技術專案文件書寫規範指南
- Python命名規範Python
- 開發規範文字(自我學習)