Python 钩子函数详解
###### 钩子函数 ```
import pluggy hookspec = pluggy.HookspecMarker('aaa')
hookimpl = pluggy.HookimplMarker('aaa') class MySpec(): @hookspec() # firstresult=True设置之后,等到第一个返回非空结果的hookimpl,就返回(hookwrapper还是正常执行)
def myhook(self, arg_one, arg_two):
pass class MyPlugin(): @hookimpl() # tryfirst=True,trylast=True定义执行顺序
def myhook(self, arg_one):
print('arg_one')
return arg_one class MyPluginOther(): @hookimpl()
def myhook(self, arg_one, arg_two):
print('arg_one, arg_two')
return arg_one, arg_two class MyPluginWrapper():
'''
hookwrapper作为每个钩子函数的上下文运行
在所有hook之前先运行
'''
@hookimpl(hookwrapper=True)
def myhook(self):
print('-------- hool wrapper before -----------') outcome = yield # 生成器会给outcome send一个pluggy.callers._Result对象 print('-------- hook wrapper after -----------')
res = outcome.get_result() # 通过get_result拿到所有钩子函数的结果
print('get all hook return ', res)
outcome.force_result(1) # 强制更改钩子函数返回结果 print('-------- hook wrapper end-----------') test1 = pluggy.PluginManager('aaa')
test1.add_hookspecs(MySpec) test1.register(MyPlugin())
test1.register(MyPluginOther()) # 后注册的先执行,收集进结果
test1.register(MyPluginWrapper()) result = test1.hook.myhook(arg_one=1, arg_two=2) # hookimpl调用,必须用关键字语法
print(result) ------------------
输出结果:
-------- hool wrapper before -----------
arg_one, arg_two
arg_one
-------- hook wrapper after -----------
get all hook return [(1, 2), 1]
-------- hook wrapper end-----------
1
```
Python 钩子函数详解的更多相关文章
- Vue之生命周期函数和钩子函数详解
在学习vue几天后,感觉现在还停留在初级阶段,虽然知道怎么和后端做数据交互,但是对对vue的生命周期不甚了解.只知道简单的使用,而不知道为什么,这对后面的踩坑是相当不利的.因为我们有时候会在几个钩子函 ...
- vue2.0项目实战(4)生命周期和钩子函数详解
最近的项目都使用vue2.0来开发,不得不说,vue真的非常好用,大大减少了项目的开发周期.在踩坑的过程中,因为对vue的生命周期不是特别了解,所以有时候会在几个钩子函数里做一些事情,什么时候做,在哪 ...
- vue生命周期钩子函数详解
版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明. 本文链接:https://blog.csdn.net/qq_35585701/article/ ...
- python super()函数详解
引言: 在类的多继承使用场景中,重写父类的方法时,可能会考虑到需要重新调用父类的方法,所以super()函数就是比较使用也很必要的解决方法: 文章来源: http://www.cnblogs.com/ ...
- Python匿名函数详解
python 使用 lambda 来创建匿名函数. lambda这个名称来自于LISP,而LISP则是从lambda calculus(一种符号逻辑形式)取这个名称的. 在Python中,lambda ...
- 04 python之函数详解
一.函数初识 函数的产生:函数就是封装一个功能的代码片段. li = ['spring', 'summer', 'autumn', 'winter'] def function(): count = ...
- Python sorted函数详解(高级篇)
sorted() 函数对所有可迭代的对象进行排序操作. sort 与 sorted 区别: sort 是应用在 list 上的方法,sorted 可以对所有可迭代的对象进行排序操作. list 的 s ...
- python socket函数详解
关于socket函数,每个的意义和基本功能都知道,但每次使用都会去百度,参数到底是什么,返回值代表什么意义,就是说用的少,也记得不够精确.每次都查半天,经常烦恼于此.索性都弄得清楚.通透,并记录下来, ...
- Python print函数详解
1 """ 2 print(...) 3 print(value, ..., sep=' ', end='\n', file=sys.stdout, flush=Fals ...
随机推荐
- linux--->用户管理和sudo权限
linux 用户 配置文件 linux主要通过用户配置文件来查看和修改用户信息 etc/passwd 第一个字段:用户名 第二个字段:密码标志 (表明这个用户有密码,密码放在etc/shadow文件) ...
- Express+MySQL实现登录注册的demo
MySQL5.7.20 demo准备 安装MySQL,安装完毕之后添加系统环境变量在cmd中启动服务:net start mysql57,如果是安装MySQL8.0则服务名默认时mysql80,测试安 ...
- Selenium(七):截图显示等待
一.显示等待(有条件等待) 常见问题: 定位明明是对的,为什么运行代码没找到定位. 定位明明是对的,找到定位了,文本信息为什么取到是空的? 分析原因: 没有处理frame 页面渲染速度比自动化测试的代 ...
- 整合spring-data-redis以及redisTemplate的使用
一.导入依赖配置 <dependency> <groupId>redis.clients</groupId> <artifactId>jedis< ...
- Informatica在linux下安装搭建
安装介质清单准备 介质名称 版本信息 描述 Informatica Powercenter 9.5.1 for Linux 64 bit 必须 Java Jdk 1.6.0_45 for Linux ...
- 一份中规中矩的 iOS笔试题
一.背景 因为一些原因,我从公司离职,在此之前,我需要帮忙招聘一个新人来做我的工作,于是就有了这篇文章. 由于公司项目16年就已经上线了,前同事写的项目中,有用xib.storyBoard.代码自动布 ...
- 五、Shell运算
整数值运算 使用expr命令:只能做整数运算,默认返回计算结果 格式: expr 整数1 运算符 整数2 ... 整数值可以有变量提供,直接给出运算结果 + 加法 expr 43 + 21 .expr ...
- 实验5: IOS的升级与恢复
实验5: IOS的升级与恢复 实验目的 通过本实验可以掌握 1) 掌握IOS 正常的情况下升级IOS2) IOS 丢失的情况下使用TFTP恢复IOS3) IOS 丢失的情况下使用X ...
- 利用Atomic, ThreadLocal, 模仿AQS, ReentrantLock
/** * @description 队列同步器,利用原子整形模仿AQS,非公平锁(简单自适应自旋) * @since 2020/2/4 */ public class QueueSynchroniz ...
- java核心技术----接口
接口:用来描述类具有什么功能,而并不给出每个功能的具体实现. 一个类可以实现一个或多个接口. 克隆(深拷贝):创建一个新对象,且新的对象的状态与原始对象的状态相同.当对克隆的新对象进行修改时,不会影响 ...