Pluggy源码解读----pluggy源码解读基础准备

news2025/1/10 20:39:51

【原文链接】Pluggy源码解读----pluggy源码解读基础准备

解读pluggy源码,直接使用pytest环境中安装的pluggy即可,比如这里安装的pluggy版本是1.0.0,为了更好的理解源码,这里首先使用如下应用代码作为应用实例,从如下代码中可以分析出,pluggy的使用步骤主要包括一下几个步骤:
1) HookspecMarker类实例化
2) HookimplMarker类实例化
3) 定义一个接口类,接口类中的函数上使用1)中的实例化作为装饰器装饰
4) 定义一个实现类,实现类中的函数上使用2)中的实例化作为装饰器装饰
5) PluginManager类实例化
6) 对5)中的实例调用 add_hookspecs方法
7) 使用5)中的实例调用注册方法
8) 通过5)中实例的hook属性调用接口方法。

import pluggy

hookspec = pluggy.HookspecMarker("myproject")
hookimpl = pluggy.HookimplMarker("myproject")

class MySpec:
    @hookspec
    def myhook(self, arg1, arg2):
        pass

class Plugin_1:
    @hookimpl()
    def myhook(self, arg1, arg2):
        print("in Plugin_1.myhook()")
        return arg1 + arg2

class Plugin_2:
    @hookimpl(hookwrapper=True)
    def myhook(self, arg1, arg2):
        print("in Plugin_2.myhook() before yield...")
        output=yield
        result=output.get_result()
        print("in Plugin_2.myhook() after yield...")
        print(result)


class Plugin_3:
    @hookimpl
    def myhook(self, arg1, arg2):
        print("inside Plugin_3.myhook()")
        return arg1 - arg2+10

pm = pluggy.PluginManager("myproject")
pm.add_hookspecs(MySpec)
pm.register(Plugin_1())
pm.register(Plugin_2())
pm.register(Plugin_3())
results = pm.hook.myhook(arg1=1, arg2=2)
print("after all run ...")
print(results)

为更好的定位跳转,可以在pycharm中打开上述测试代码,并配置解释器,然后即可在External Library中找到pluggy的源码了,如下图所示。

pluggy 源码只有以下7个文件

pluggy
  |--------__init__.py
  |--------_caller.py
  |--------_hooks.py
  |--------_manager.py
  |--------_result.py
  |--------_tracing.py
  |--------_version.py

其中__init__.py文件代码如下,即这里通过__all__限定了pluggy外部只允许使用PluginManager、PluginValidationError、HookCallError、HookspecMarker、HookimplMarker这五个类。

try:
    from ._version import version as __version__
except ImportError:
    # broken installation, we don't even try
    # unknown only works because we do poor mans version compare
    __version__ = "unknown"

__all__ = [
    "PluginManager",
    "PluginValidationError",
    "HookCallError",
    "HookspecMarker",
    "HookimplMarker",
]

from ._manager import PluginManager, PluginValidationError
from ._callers import HookCallError
from ._hooks import HookspecMarker, HookimplMarker

而_version.py中的内容如下,这里是设置pluggy版本号的。

# coding: utf-8
# file generated by setuptools_scm
# don't change, don't track in version control
version = '1.0.0'
version_tuple = (1, 0, 0)

然后就可以在pycharm中对pluggy应用实例脚本中通过按住Ctrl键,然后鼠标点击即可跳转到对应的函数定义了,比如如下图所示

然后就可以根据pluggy的应用实例代码对pluggy源码进行解析了。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/75394.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ASEMI电磁炉整流桥KBJ2510参数和性能

编辑-Z ASEMI电磁炉整流桥KBJ2510参数和性能怎么样呢?ASEMI采用波峰的GPP大芯片,工艺制造,稳定性高,抗冲击性强。KBJ2510具体参数为:正电流:25A,反向耐压:1000V,反向电流…

openai注册流程

前置条件 1、注册登陆的时候需要使用梯子,梯子使用美国的,其他地区的梯子不一定正常使用 2、海外短信验证码 3、整个流程使用梯子 4、登陆后可以不用梯子-正常使用 openai网址 https://chat.openai.com https://openai.com https://beta.openai.…

四面阿里斩获offer定级为P7+ 2022年最新阿里巴巴70道高级面试题

前言 **四面阿里的面经总结:**我觉得有一个能够找一份大厂的 offer的想法,这是很正常的,这并不是我们的饭后谈资而是每个技术人的追求。像阿里、腾讯、美团、字节跳动、京东等等的技术氛围与技术规范度还是要明显优于一些创业型公司 / 小公司…

鸿翼档案信创管理系统——为您的数字资产加上“安全锁”

为了应对日益复杂的国际形势,确保关键技术自主可控、保障关键技术自主可控、保障网络信息安全,我国再近几年提出了信息技术应用创新战略(简称“信创”)。 通俗来讲,信创就是在核心芯片、基础硬件、操作系统、中间件、…

K_A08_012 基于 STM32等单片机驱动 DRV8833 模块按键控制直流电机正反转

目录 一、资源说明 二、基本参数 参数 引脚说明 三、驱动说明 驱动时序 对应程序: 四、部分代码说明 接线说明 STC89C52RCDRV8833模块 STM32F103C8T6DRV8833模块 五、基础知识学习与相关资料下载 六、视频效果展示与程序资料获取 七、项目所有材料清单 八、注意事项 九…

《自己动手写CPU》学习记录(4)——第4章/Part 2

目录 引言 致谢 拥有Linux开发环境 1、Linux虚拟机安装 2、共享文件夹 GNU工具链安装 Makefile RAM.ld Bin2Mem.exe 注意 路径 测试 引言 上篇文章实现了 ori 指令,并且搭建验证平台,验证了功能的正确性。但是有一个问题就是,当…

寻找网络1020的结构平衡点

( A, B )---2*n*2---( 1, 0 )( 0, 1 ) 用网络分类A和B,让A是(0,1)(0,0),让B是(1,0)(0,0)。记为网络1020.AB的…

湖南中医药大学宿舍无线网络一体化项目

第二次上大王老师的课,上学期的微机这学期的计网,这学期一开学就是一个大项目,对于零基础,零经验的我们来说,老师布置给我们一项比较重大的任务就是——从零开始为我们学校宿舍部署无线网络。刚开始觉得这肯定完不成&a…

CRM客户管理系统能为小微型企业带来哪些优势?

回款&销售排名看板CRM(顾客关系管理工作控制系统)在亚洲地区发展了三十余年,让众多民营企业管理工作形式成功的从实体店转至线上,因此协助民营企业展开管理工作上的高效率提高,CRM控制系统做为两个能协助各类民营企…

python学习中的各种迷一样的问题之一

神秘一 Argument name should be lowercase oneX这个变量名可以改成one_x 神秘二 无缘无故被in 到def里的main() 原因是400行少了个" ) " 神秘三一个文件位置引发的血案 无法执行使用所选元素重构,别用捷克键盘来唬人了 test_03_2022-1202_to_2022-1209.py在…

你不知道13个嵌入式C语言优化技巧

【推荐阅读】 关于如何快速学好,学懂Linux内核。内含学习路线 深入linux内核架构--内存管理 了解ixgbe网卡驱动— 驱动注册(纯代码分享) 手把手教你如何编写一个Makefile文件 需要多久才能看完linux内核源码? 嵌入式系统受其使用的…

H02-RCNN和SPPNet

目录 1.目标检测-Overfeat模型 1.1 滑动窗口 1.2 Overfeat模型总结 2.目标检测-RCNN模型 2.1 完整的R-CNN结构 2.1.1 候选区域(Region of lnterest)得出(了解) 2.1.2 CNN网络提取特征 2.1.3 特征向量训练分类器SVM 2.1.4 非最大抑制(NMS) 2.1.…

Mybatis-plus 源码执行全流程解析

Mybatis-plus 源码执行全流程解析 废话 少数流程开始: 1、业务入口:userMapper.insertBatch(entityList); 执行到代理类: $Proxy222 (com.sun.proxy) 开始走代理流程,然后到了代理类: idea 执行流程取出栈信息&…

Mybatis增删改查

Mybatis增删改查 1,配置文件实现CRUD 1.1 环境准备 数据库表(tb_brand)及数据准备 -- 删除tb_brand表 drop table if exists tb_brand; -- 创建tb_brand表 create table tb_brand (-- id 主键id int primary key auto_increment,…

string的认识和使用

目录 一、网站上查看string类 1.网站 2.网站上的string类 二、string类的成员函数 1.默认成员函数 (1)构造函数、拷贝构造函数和析构函数 (2)赋值运算符重载 (3)容量操作 (4&#xff09…

JavaWeb用户信息查看的登录、增删改查案例

黑马JavaWeb案例整理记录 文章目录案例源码:一、需求二、设计1、技术选型2、数据库设计三、开发步骤四、详细过程1、创建web项目,部署tomcat,导入jar包2、编写首页index.jsp3、编写servlet、servie、daomain、dao五、案例升级实现1、实现内容…

成长任务|花式show爱心代码

❤️立即投稿❤️ 📌活动规则 最近#李峋同款爱心代码#词条上了热搜,作为程序员的你,可不能错过这个给意中人大展身手的时机 ❤️ 使用代码画一颗#爱心#,将你的代码文件通过本页面投稿,审核通过即可参与活动 ❤️ 可使…

速锐得猎奇与猜想:数字化工业互联网能否真的走进未来

前年的8月份,我们独立设计一款燃气报警器,包括设计产品图纸,嵌入式软件、LED显示、核心代码、CAN网络及485架构、云端SAAS框图,应用场景等,在去年的5月份直接进入到了量产,第一批数量是2000套,升…

详细介绍NLP文本摘要

文章目录文本生成文本摘要抽取式文本摘要抽取式文本摘要方法案例分析优点缺点生成式文本摘要指针生成网络文本摘要预训练模型与生成式摘要优点缺点TextRank文本摘要BertSum模型文本摘要文本生成 文本生成(Text Generation):接收各种形式的文…

IT行业几大方向(外行人之误解)

有很多同学一说自己是搞计算机的,搞软件的,做IT的,是个程序员。外行人,就往往很惊奇,说我电脑卡怎么处理,怎么盗别人QQ密码,把谁谁网站黑了,甚至我的网络很慢可以帮我提速一下吗等等…