Coding筆記(4): Package 套件

JianJie
Jul 31, 2021

--

當我們已經開始組件多個Module,其每個Module分別實踐多個功能後,可以再對程式碼再次打包,管理多個Module,並將多個Module組合為一個Package。

而我們可以將Package及Module看做是資料夾及檔案間的關係,Package就是資料夾,用來管理多個檔案或是子資料夾(Subpackage),而Module則是檔案,整合多個Function。

Package 結構

將多個Module放入資料夾中並新增__init__.py,此資料夾就會被定義為Package,檔案路徑如下:

__init__.py可以為一個空文件,或是在其中Import會使用之Package。在Import Package時,會先檢查__init__.py是否存在,假如存在就會被定義為Package,並且會先執行一次。因此可以在__init__.py撰寫一些預設值或是預載Package。

而Package中再有Package(subpackage),擁有多層級的Package:

目前常見的Package如Numpy、OpenCV、sklearn等這些Package都是多層級的Package,其中包含許多Subpackage、Module、Function、Class等。

Package Import

而在主程式中,引用Package與Module的方法雷同,可使用from … import … 或是 import …

每一種引用方式會有不同使用的Function使用方式。

但要注意一點,Import有一些限制條件,以上方Calculate Package為舉例:

以上三種方式都可以正確的引用Package中的Module、Function,只是最後使用Fucntion的方式不同,可以使用dir()檢查Package的所有屬性,以上的Calculate Package中都有名為add_module的Module,因此可以正常引用Module中的Function。

但在import時未引用到Module層時,Package無Module資訊,因此也無法使用Module中的Function。

無法引用狀態是因為Import會自動將Module中的item載入Namespace,但Package或Module這些檔案並不會自動載入,因此import時會產生錯誤。

而上方則是import中混雜Package、Module、Function,只能Import Package or Module,不可直接import Package或Module中的Function。
而以下這種狀況則是Import語法錯誤,無法使用。

其他第三方Package Import方式

在其他第三方Package中(如Numpy),Import Package後可以直接使用Package中的所有Function。但我們卻會發生上述問題 (Package or Module未加入Namespace問題),這時就可以使用__init__.py來解決這個問題。

在__init__.py中將Package下的所有Module及Subpackage先加入Namespace,如Numpy中的__init__.py:

在Import Package時就會預先將所有Subpackage或Module加入Namespace,並且跳過Module名稱。以下圖的資料結構為例:

要Import add_module內的Function,其寫法為:

假如單純Import Package時,就會因為Namespace中無Module而產生無法使用Function的問題。

而在__init__.py中預先Import Module,如圖所示:

就可以直接Import Package,且省略Module名稱:

--

--

JianJie
JianJie

Written by JianJie

Image Processing / Computer Vision / Deep Learning

No responses yet