學委之前分享了很多代碼,也釋出了幾個庫。
新手可以從兩篇基礎文章入手學習,積累了一些代碼,可以考慮做成一個個子產品,包裝代碼有利調用和傳播!
何為子產品
小雷拿了一個短棍,一個鐵方塊,接着把鐵塊跟短棍焊接一起,就是我們看到的雷神之錘了!(如下,一把簡陋的錘子)![]()
總結一下Python的子產品加載解析何為子產品制作子產品與使用延伸
為什麼說這個錘子?
子產品就是一組python功能集合,比如sys, 或者requests這個就是一個子產品,或者學委開發的pypiseed也是一個子產品,簡單了解就是,把基礎python代碼組合成為一個’錘子‘,被外部使用。
制作子產品的意義是,友善更多的子產品使用者(開發者)就不用太拘泥這個子產品怎麼做,簡單就調用一個子產品。
下面os.py, python自帶的子產品,這是一個子產品!
下面requests目錄, 是學委自己安裝的, 這也是一個子產品!
下面的pypi-seed, 也是一個子產品,更多介紹在
這篇種子項目文章子產品 vs 庫(包) 差別
子產品可以是一個python檔案, 學委認為也可以是一個庫(多個python檔案的整體)。
但是我們說一個庫,通常就是上面提到的pypi_seed 或者requests這些目錄組織的,通常包含多個python代碼檔案,也就是說複雜度更高,可以了解為‘複雜子產品’。
直白來說都是一種“封裝”,包裝,把零散的功能組合起來,就成做出一個個‘錘子’,解決各種開發遇到的問題。
在python裡面也使用“package”(包)來概括這種複雜子產品。
如上圖,‘moduledemo’ 就是一個包(package)。
是以嚴格來說:包 對等于 庫,包内有多個子產品。使用上包/庫/子產品都是用‘import’來導入。
制作子產品與使用
開發子產品
儲存下面代碼為debug.py
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/10/15 11:12 下午
# @Author : LeiXueWei
# @CSDN/Juejin/Wechat: 雷學委
# @XueWeiTag: CodingDemo
# @File : debug.py
# @Project : hello
SHOW_DEBUG = True
def log(log):
if SHOW_DEBUG:
print(str(log))
隻需要打開安裝的python路徑裡面的lib/python3.8/os.py
把os.py的代碼過一遍,我們可以發現,其實os用了abc/sys/stat這些内置子產品,實作了os子產品自己的函數比如makedirs(建立目錄)或者拓展os.path。
制作一個複雜子產品請參考詳細指導篇,處理明确子產品的功能開發規劃,更重要的就是組織,管理釋出子產品了,這涉及很多知識,請看下面的文章:
保姆級教程帶你開發優質的Python庫之上篇【子產品組織】
保姆級教程帶你開發優質的Python庫之中篇【指令行】
保姆級教程帶你開發優質的Python庫之下篇【種子項目】
調用子產品 import
#!/usr/bin/env python
# -*- coding: utf-8 -*-
# @Time : 2021/10/15 11:15 下午
# @Author : LeiXueWei
# @CSDN/Juejin/Wechat: 雷學委
# @XueWeiTag: CodingDemo
# @File : test.py
# @Project : hello
#option 1
import debug
debug.log("hello 01")
#option 2
from debug import log
log("hello 01")
#option 3
from debug import log as l
l("hello 01")
這裡展示了三種調用方式,效果都是一樣的。
也可以像下面一樣:from 子產品名稱 import * (任意函數)
from debug import *
包或者庫的函數調用參考下面:
#import 包名.子產品名 imiport * 或者 (import 特定函數)
from pypiseed.main import *
直接運作一個子產品
這個也非常簡單,在開發的debug.py子產品中添加下面的代碼到檔案末:
if __name__ == "__main__":
log("testing")
運作方式:python debug.py
這個就是告訴python程式這裡是main入口程式,裡面放入調用子產品函數的代碼,即可運作。
子產品搜尋, 定個位
在python中子產品是這樣被定位/搜尋的:
最先從目前運作目錄查找子產品
如果還沒有找到,python嘗試搜尋PYTHONPATH環境變量指定的多個目錄,從前到後一個一個目錄查找目标子產品
如果前面兩個步驟仍舊沒有找到,python解析器将會查找預設路徑,比如/usr/local/lib/python3/
這上面其實都是路徑,我們看到python的子產品系統使用了sys.path這個變量來存儲,是以直接簡記為:從sys.path值裡面的目錄一個一個查找搜尋子產品。
sys.path的隻也預設的被設定為目前路徑,PYTHONPATH, 系統預設(跟安裝路徑有關),如下圖:
幾個子產品相關的函數
reload 子產品重載函數
我們剛剛看到os.py 出來def 定義了一些函數,還有一些類似"all" 這樣的代碼,這些代碼隻會在import/ from import 語句導入子產品的時候被執行,我們可以使用reload函數重新加載非方法定義的代碼。
使用執行個體:
#重新加載debug子產品,那些在方法體外直接執行的代碼會再次被運作。
reload(debug)
dir 羅列函數
dir函數也是内置函數之一,它傳回一個排序過的清單。這個清單就是目前程式運作時導入的所有子產品。
如下圖,分次倒入了不同子產品,dir函數的傳回值不同了。
延伸
Python的子產品加載跟Java的其實還是有點相像的。
不過Java的會更加複雜一些。Python還支援運作時動态更改子產品搜尋的路徑,這個特性比Java更加靈活,後面會繼續分享文章講解