天天看點

總結一下Python的子產品加載解析何為子產品制作子產品與使用延伸

學委之前分享了很多代碼,也釋出了幾個庫。

新手可以從兩篇基礎文章入手學習,積累了一些代碼,可以考慮做成一個個子產品,包裝代碼有利調用和傳播!

何為子產品

小雷拿了一個短棍,一個鐵方塊,接着把鐵塊跟短棍焊接一起,就是我們看到的雷神之錘了!(如下,一把簡陋的錘子)
總結一下Python的子產品加載解析何為子產品制作子產品與使用延伸

為什麼說這個錘子?

子產品就是一組python功能集合,比如sys, 或者requests這個就是一個子產品,或者學委開發的pypiseed也是一個子產品,簡單了解就是,把基礎python代碼組合成為一個’錘子‘,被外部使用。

制作子產品的意義是,友善更多的子產品使用者(開發者)就不用太拘泥這個子產品怎麼做,簡單就調用一個子產品。

下面os.py, python自帶的子產品,這是一個子產品!

總結一下Python的子產品加載解析何為子產品制作子產品與使用延伸

下面requests目錄, 是學委自己安裝的, 這也是一個子產品!

總結一下Python的子產品加載解析何為子產品制作子產品與使用延伸

下面的pypi-seed, 也是一個子產品,更多介紹在

這篇種子項目文章
總結一下Python的子產品加載解析何為子產品制作子產品與使用延伸

子產品 vs 庫(包) 差別

子產品可以是一個python檔案, 學委認為也可以是一個庫(多個python檔案的整體)。

但是我們說一個庫,通常就是上面提到的pypi_seed 或者requests這些目錄組織的,通常包含多個python代碼檔案,也就是說複雜度更高,可以了解為‘複雜子產品’。

直白來說都是一種“封裝”,包裝,把零散的功能組合起來,就成做出一個個‘錘子’,解決各種開發遇到的問題。

在python裡面也使用“package”(包)來概括這種複雜子產品。

總結一下Python的子產品加載解析何為子產品制作子產品與使用延伸

如上圖,‘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

總結一下Python的子產品加載解析何為子產品制作子產品與使用延伸

把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, 系統預設(跟安裝路徑有關),如下圖:

總結一下Python的子產品加載解析何為子產品制作子產品與使用延伸

幾個子產品相關的函數

reload 子產品重載函數

我們剛剛看到os.py 出來def 定義了一些函數,還有一些類似"all" 這樣的代碼,這些代碼隻會在import/ from import 語句導入子產品的時候被執行,我們可以使用reload函數重新加載非方法定義的代碼。

使用執行個體:

#重新加載debug子產品,那些在方法體外直接執行的代碼會再次被運作。
reload(debug)
      

dir 羅列函數

dir函數也是内置函數之一,它傳回一個排序過的清單。這個清單就是目前程式運作時導入的所有子產品。

如下圖,分次倒入了不同子產品,dir函數的傳回值不同了。

總結一下Python的子產品加載解析何為子產品制作子產品與使用延伸

延伸

Python的子產品加載跟Java的其實還是有點相像的。

不過Java的會更加複雜一些。Python還支援運作時動态更改子產品搜尋的路徑,這個特性比Java更加靈活,後面會繼續分享文章講解