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

news/2025/3/4 5:04:10/

pluggy的hook调用,最重要的就是使用了__call__魔法函数,这个函数能够在我们调用实例时,自动调用这个函数,无需自己手动调用。
前面介绍了各个类的方法,这里简述下pluggy的调用流程(主要介绍主流程,分支处理忽略)。
前面我们介绍了HookspecMarker和HookimplMarker这两个类,这两个类是用来作装饰器用的,spec相当于接口类,impl为实现类。我们这边还用之前的例子,来介绍下插件的注册调用流程。

import pluggyspec_test = pluggy.HookspecMarker('test11')
impl_test = pluggy.HookimplMarker('test11')class Spec:@spec_testdef pluggy_test(self, arg1):print(f'this is spec test and arg is {arg1}')passclass Impl1:@impl_testdef pluggy_test(self, arg1):print(f'this is test1 and arg is {arg1}')return arg1class Impl2:@impl_testdef pluggy_test(self, arg1):print(f'this is test2 and arg is {arg1}')return -1 * arg1pm = 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的整体注册调用流程,细节部分可结合前后文一起看下。


http://www.ppmy.cn/news/1576187.html

相关文章

从【人工智能】到【计算机视觉】,【深度学习】引领的未来科技创新与变革

前几天偶然发现了一个超棒的人工智能学习网站,内容通俗易懂,讲解风趣幽默,简直让人欲罢不能。忍不住分享给大家,点击这里立刻跳转,开启你的AI学习之旅吧! 前言 – 人工智能教程https://www.captainbed.cn/l…

大型语言模型技术对比:阿里Qwen qwq、DeepSeek R1、OpenAI o3与Grok 3

1. 引言 在人工智能(AI)领域中,大型语言模型(Large Language Models,简称LLM)近年来取得了显著的突破。从早期的GPT-3到如今的各种高级模型,这些技术不仅推动了自然语言处理(NLP&am…

JavaScript算法-合并两个有序链表

合并两个有序链表 描述 将两个已按升序排列的链表合并为一个新的升序链表,并返回该链表。 示例: 输⼊:1->3->5, 2->4->6 输出:1->2->3->4->5->6前置知识 递归链表 思路 使⽤递归的方式来实现&…

《Llama 3.2-Vision:开启多模态AI新时代》:此文为AI自动生成

Llama 3.2-Vision 是什么 在人工智能的快速发展进程中,多模态技术成为了推动行业变革的关键力量。Llama 3.2-Vision 作为 Meta 公司推出的新一代多模态大语言模型,以其卓越的视觉与语言融合能力,为 AI 领域带来了全新的突破。它的出现&#…

2025-03-01 学习记录--C/C++-C语言 整数类型对比

C语言 整数类型对比 类型位数范围(有符号)范围(无符号)格式化符号char8-128 到 1270 到 255%c 或 %hhdshort16-32,768 到 32,7670 到 65,535%hdint32-2,147,483,648 到 2,147,483,6470 到 4,294,967,295%dlong32 或 64-2,147,483…

Python 实战:构建分布式文件存储系统全解析

Python 实战:构建分布式文件存储系统全解析 在当今数据爆炸的时代,分布式文件存储系统凭借其高可扩展性、高可靠性等优势,成为了数据存储领域的热门选择。本文将详细介绍如何使用 Python 构建一个简单的分布式文件存储系统。从系统架构设计&…

【Python爬虫(55)】Scrapy进阶:深入剖析下载器与下载中间件

【Python爬虫】专栏简介:本专栏是 Python 爬虫领域的集大成之作,共 100 章节。从 Python 基础语法、爬虫入门知识讲起,深入探讨反爬虫、多线程、分布式等进阶技术。以大量实例为支撑,覆盖网页、图片、音频等各类数据爬取,还涉及数据处理与分析。无论是新手小白还是进阶开发…

卷积神经网络(cnn,类似lenet-1,八)

我们第一层用卷积核,前面已经成功,现在我们用两层卷积核: 结构如下,是不是很想lenet-1,其实我们24年就实现了sigmoid版本的: cnn突破九(我们的五层卷积核bpnet网络就是lenet-1)-CS…