個人拙見,有錯請各位指出。
原始碼這個東西怎麼入手還是挺講究的,我打算從pytest的核心框架python pluggy出發,首先介紹下pluggy。
解讀過程主要按**邏輯走,不會按照原始碼分布去解讀,望理解。
如果的我的文章對您有幫助,不符動動您的金手指給個star,予人玫瑰,手有餘香,不勝感激。
github
官方是這麼介紹pluggy的
"this is the core framework used by thepytest
,tox
, anddevpi
projects."
「這是pytest
、tox
和devpi
專案使用的核心框架。」
很顯然,這就是我們讀pytest原始碼要從它開始的原因。
pluggy一開始是作為pytest原始碼的一部分存在的,在後期被分離出來了,作為乙個外部的依賴來使用。
# -*- coding:utf-8 -*-
from pluggy import pluginmanager, hookspecmarker, hookimplmarker
hookspec = hookspecmarker(
"mypluggydemo_1"
)#乙個宣告hook method的類,每個hook method都需要用@hookspec來裝飾
hookimpl = hookimplmarker(
"mypluggydemo_1"
)#乙個plugin的實現,需要完整實現對應的hook方法,並通過@hookimpl來裝飾
class
hookspec
: @hookspec
defcalculate
(self, a, b)
:pass
class
hookimpl1
: @hookimpl
defcalculate
(self, a, b)
:return a + b
pm = pluginmanager(
"mypluggydemo_1"
)#建立pluginmanager物件
pm.add_hookspecs(hookspec)
pm.register(hookimpl1())
results = pm.hook.calculate(a=
1, b=5)
print
(results)
[6]
整個專案中需要保證乙個全域性唯一的project name(具體原因放到後面再講),此demo為mypluggydemo_1
hookspec
是乙個宣告hook method的類,每乙個hook method需要用hookspec
裝飾器裝飾
hookimpl1
是乙個plugin的實現,需要完整實現對應的hook方法,並通過hookimpl
裝飾器裝飾實現方法
**的核心邏輯是先建立乙個外掛程式管理物件pluginmanager,並在該物件上註冊hook物件hookspec和與之對應的plugin物件hookimpl1,然後通過pluginmanager自帶的hook屬性來呼叫對應的hook方法,傳入相關引數。
注意:呼叫hook方法時引數需以關鍵字的形式傳遞。
pytest原始碼 pytest原始碼目錄概要分析
pytest是什麼?pytest是乙個非常成熟的全功能的python測試框架。怎麼安裝?pip install pytest github專案位址在哪?pytest原始碼結構 在python安裝目錄的lib site packges下,分為pytest.py 和 pytest目錄 我們先看下pyte...
hadoop原始碼閱讀 1 原始碼目錄結構
由於版本的不同,可能部分目錄有些不同.bin 此目錄下為進行hadoop配置 執行以及管理的shell命令集合 c 此目錄下為linux下amd64 64位系統以及i386 32位系統提供的庫檔案集合 conf 此目錄下為執行與配置hadoop環境需要的配置檔案以及示例檔案集合,實際執行時可以對照此...
extend 的實現原始碼 (原始碼學習1)
目標 extend console.log add 1,2 是怎麼實現可以將add函式掛在jquery後面?jquery v1.12.4 1 jquery.extend jquery.fn.extend function 4 i 1,5 length arguments.length,6 deep ...