網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
代碼為例進(jìn)行說(shuō)明
實(shí)踐環(huán)境
Python 3.6.5
pluggy 0.13.0
例1 注冊(cè)類(lèi)函數(shù)為插件函數(shù)
#!/usr/bin/env python # -*- coding:utf-8 -*- import pluggy hookspec = pluggy.HookspecMarker("myproject") # hook 標(biāo)簽 用于標(biāo)記hook hookimpl = pluggy.HookimplMarker("myproject") # hook 實(shí)現(xiàn)標(biāo)簽 用于標(biāo)記hook的一個(gè)或多個(gè)實(shí)現(xiàn) class MySpec(object): """hook 集合""" @hookspec def myhook(self, arg1, arg2): pass @hookspec def my_hook_func1(self, arg1, arg2): pass @hookspec def my_hook_func2(self, arg1, arg2): pass # 插件類(lèi) class Plugin_1(object): """hook實(shí)現(xiàn)類(lèi)1""" @hookimpl def myhook(self, arg1, arg2): print("Plugin_1.myhook called") return arg1 + arg2 @hookimpl def my_hook_func2(self, arg1, arg2): print("Plugin_1.my_hook_func2 called, args:", arg1, arg2) def my_hook_func3(self, arg1, arg2): print("Plugin_1.my_hook_func3 called, args:", arg1, arg2) class Plugin_2(object): """hook實(shí)現(xiàn)類(lèi)2""" @hookimpl def myhook(self, arg1, arg2): print("Plugin_2.myhook called") return arg1 - arg2 @hookimpl def my_hook_func2(self, arg1, arg2): print("Plugin_2.my_hook_func2, args:", arg1, arg2) # 初始化 PluginManager pm = pluggy.PluginManager("myproject") # 登記hook集合(hook函數(shù)聲明) pm.add_hookspecs(MySpec) # 注冊(cè)插件(hook函數(shù)實(shí)現(xiàn)) pm.register(Plugin_1()) pm.register(Plugin_2()) # 調(diào)用自定義hook results = pm.hook.myhook(arg1=1, arg2=2) # 調(diào)用兩個(gè)插件類(lèi)中的同名hook函數(shù) # 后注冊(cè)的插件中的函數(shù)會(huì)先被調(diào)用 print(results) # 輸出 [-1, 3] results = pm.hook.my_hook_func1(arg1="name", arg2="shouke") print(results) pm.hook.my_hook_func2(arg1="addr", arg2="sz")
運(yùn)行結(jié)果
Plugin_2.myhook called
Plugin_1.myhook called
[-1, 3]
[]
Plugin_2.my_hook_func2, args: addr sz
Plugin_1.my_hook_func2 called, args: addr sz
例2 注冊(cè)模塊函數(shù)為插件函數(shù)
myhookspec.py
, myhookimpl.py
, other.py
, example.py
位于同一包目錄下
myhookspec.py
import pluggy hookspec = pluggy.HookspecMarker("myproject") # hook 標(biāo)簽 用于標(biāo)記hook hookimpl = pluggy.HookimplMarker("myproject") # hook 實(shí)現(xiàn)標(biāo)簽 用于標(biāo)記hook的一個(gè)或多個(gè)實(shí)現(xiàn) @hookspec def global_hook_func1(arg1, arg2): pass
myhookimpl.py
import pluggy from myhookspec import hookimpl @hookimpl def global_hook_func1(arg1, arg2): print("global_hook_func1 in myhookimpl.py, args:", arg1, arg2) return "myhookimpl.py"
other.py
from myhookspec import hookimpl @hookimpl def global_hook_func1(arg1, arg2): print("global_hook_func1 in other.py, args:", arg1, arg2) return "other.py"
example.py
#!/usr/bin/env python # -*- coding:utf-8 -*- import sys import pluggy import myhookspec import myhookimpl import other # 初始化 PluginManager pm = pluggy.PluginManager("myproject") # 登記hook集合 pm.add_hookspecs(myhookspec) # 登記hook的實(shí)現(xiàn) pm.register(myhookimpl) # 插件也可以是模塊 pm.register(other) print(pm.hook.global_hook_func1(arg1="name", arg2="shouke"))
example.py運(yùn)行結(jié)果如下
global_hook_func1 in other.py, args: name shouke
global_hook_func1 in myhookimpl.py, args: name shouke
['other.py', 'myhookimpl.py']
例3:自定義插件類(lèi)實(shí)現(xiàn)hook函數(shù)免@hookimpl裝飾器
myhookspec.py
import pluggy hookspec = pluggy.HookspecMarker("myproject") @hookspec def mytest_hook_func1(arg1, arg2): pass
other.py
def mytest_hook_func1(arg1, arg2): print("global_hook_func1 in other.py, args:", arg1, arg2) return "other.py"
example.py
#!/usr/bin/env python # -*- coding:utf-8 -*- import inspect import pluggy import myhookspec import other class PytestPluginManager(pluggy.PluginManager): """ 插件類(lèi),實(shí)現(xiàn)不用@HookimplMarkerInstance裝飾的函數(shù)也可以當(dāng)做函數(shù)體 """ def parse_hookimpl_opts(self, plugin, name): # 規(guī)定免@hookimpl裝飾的 hooks 函數(shù)總是以 mytest_打頭,這樣以避免訪問(wèn)非可讀屬性 if not name.startswith("mytest_"): return method = getattr(plugin, name) opts = super().parse_hookimpl_opts(plugin, name) # 考慮hook只能為函數(shù)(consider only actual functions for hooks) if not inspect.isroutine(method): return # 收集未被標(biāo)記的,以mytest打頭的hook函數(shù),(collect unmarked hooks as long as they have the `pytest_' prefix) if opts is None and name.startswith("mytest_"): opts = {} return opts # 初始化 PluginManager pm = PytestPluginManager("myproject") # 登記hook集合 pm.add_hookspecs(myhookspec) # 登記hook的實(shí)現(xiàn) pm.register(other) pm.hook.mytest_hook_func1(arg1="addr", arg2="sz")
參考連接
https://pypi.org/project/pluggy/
原文鏈接:https://www.cnblogs.com/shouke/p/14940707.html
相關(guān)推薦
- 2022-04-17 css absolute絕對(duì)定位 讓 top 和bottom 同時(shí)生效
- 2022-10-24 Android?Flutter實(shí)現(xiàn)上拉加載組件的示例代碼_Android
- 2022-03-03 解決Warning: [antdv: LocaleProvider] `LocaleProvider
- 2022-01-18 VSCode git拉取代碼,提示:在簽出前,請(qǐng)清理存儲(chǔ)庫(kù)工作樹(shù)。
- 2022-10-31 Kotlin集合List?Set?Map使用介紹詳解_Android
- 2021-12-03 C++學(xué)習(xí)之線程詳解_C 語(yǔ)言
- 2022-06-02 C語(yǔ)言?隊(duì)列的實(shí)現(xiàn)全解析_C 語(yǔ)言
- 2022-08-28 PostgreSQL常用字符串分割函數(shù)整理匯總_PostgreSQL
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支