【pytest框架源码分析三】pluggy源码分析之hook注册调用流程

pluggy的hook调用,最重要的就是使用了__call__魔法函数,这个函数能够在我们调用实例时,自动调用这个函数,无需自己手动调用。

前面介绍了各个类的方法,这里简述下pluggy的调用流程(主要介绍主流程,分支处理忽略)。

前面我们介绍了HookspecMarker和HookimplMarker这两个类,这两个类是用来作装饰器用的,spec相当于接口类,impl为实现类。我们这边还用之前的例子,来介绍下插件的注册调用流程。

python 复制代码
import pluggy

spec_test = pluggy.HookspecMarker('test11')
impl_test = pluggy.HookimplMarker('test11')

class Spec:
    @spec_test
    def pluggy_test(self, arg1):
        print(f'this is spec test and arg is {arg1}')
        pass

class Impl1:
    @impl_test
    def pluggy_test(self, arg1):
        print(f'this is test1 and arg is {arg1}')
        return arg1

class Impl2:
    @impl_test
    def pluggy_test(self, arg1):
        print(f'this is test2 and arg is {arg1}')
        return -1 * arg1

pm = pluggy.PluginManager('test11')
pm.add_hookspecs(Spec)
pm.register(Impl1())
pm.register(Impl2())
res = pm.hook.pluggy_test(arg1=1)

pluggy.PluginManager('test11')调用后实例化一个pm,注册执行流程都依靠pm管理。

add_hookspecs(Spec)在pm中增加一个spec。

这个方法中最重要的就是实例化了一个HookCaller的对象,并且把它放到self.hook中。

然后调用pm.register(Impl1())注册 插件

注册方法中比较重要的就是实例化了一个hookimpl对象,并且把它添加到hook中,具体看就是添加到_hookimpls的list中(整体在我们上面添加的HookCaller下)。

接下继续注册第二个插件Impl2,注意hook添加spec时,是按照方法名添加的。impl1和impl2中两个方法名是一样的,所以不会添加新的name来存放impl2下的pluggy_test。Impl2的pluggy_test也和impl1的pluggy_test注册在同一个HookCaller下。

最后调用 pm.hook.pluggy_test(arg1=1)来执行插件。这里的pluggy_test就是HookCaller对象(add_hookspecs步骤)。因为HookCaller类中有__call__函数,所以调用该对象时,会自动调用该方法。

执行方法就是最下面这行。_hookexec方法即是我们初始化HookCaller传入的。

即我们在执行pm.hook.pluggy_test(arg1=1)的时候调用的_multicall方法执行插件方法。

这就是pluggy的整体注册调用流程,细节部分可结合前后文一起看下。

相关推荐
专注API从业者几秒前
告别手工盯盘:用 Open‑Claw 搭建电商商品自动化监控与数据分析实战
运维·数据结构·数据挖掘·数据分析·自动化
Rebecca_aLi2 分钟前
码匠教育:从手工表格到脚本自动化,Python 改造工作流的思路
运维·python·自动化
qq_2842740527 分钟前
电气控制与PLC·HMI触摸屏组态与自动伸缩门控制系统 CSDN发布稿
笔记·学习·自动化
玄芯散人34 分钟前
【金丹·88】Makefile从入门到放弃:手动编译自动化之路
运维·自动化
海宇大数据1 小时前
零信任架构实战:基于海宇企业综合风险报告构建自动化供应链保理对公尽调网关
运维·人工智能·架构·自动化
代码方舟2 小时前
零信任架构实战:基于天远普通维保查询构建自动化二手车融资租赁资产入库审计网关
人工智能·架构·自动化
Helix2502 小时前
Python单元测试实战:pytest框架从入门到企业级测试体系搭建指南
python·单元测试·实战·mock·pytest·测试覆盖率·fixture
虎鲸不是鱼2 小时前
AI 自动化逆向(六)AI 解一个 9 万条目的资源容器
人工智能·自动化·大模型·ai逆向·自动化逆向
qq_284274055 小时前
机械设计基础·滚动轴承全解(类型·代号·选型·寿命)+轮系与蜗杆蜗轮传动
笔记·学习·自动化·制造
建筑工程企业管理系统12 小时前
工程进度统计管理系统自动化汇总数据,解决施工企业手工对账误差难题
大数据·人工智能·自动化