Python中pluggy框架如何应用,详细的实例是怎样的
Admin 2022-09-01 群英技术资讯 1033 次浏览
Python 3.6.5
pluggy 0.13.0
#!/usr/bin/env python # -*- coding:utf-8 -*- import pluggy hookspec = pluggy.HookspecMarker("myproject") # hook 标签 用于标记hook hookimpl = pluggy.HookimplMarker("myproject") # hook 实现标签 用于标记hook的一个或多个实现 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 # 插件类 class Plugin_1(object): """hook实现类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实现类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函数声明) pm.add_hookspecs(MySpec) # 注册插件(hook函数实现) pm.register(Plugin_1()) pm.register(Plugin_2()) # 调用自定义hook results = pm.hook.myhook(arg1=1, arg2=2) # 调用两个插件类中的同名hook函数 # 后注册的插件中的函数会先被调用 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")
运行结果
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
myhookspec.py
, myhookimpl.py
, other.py
, example.py
位于同一包目录下
import pluggy hookspec = pluggy.HookspecMarker("myproject") # hook 标签 用于标记hook hookimpl = pluggy.HookimplMarker("myproject") # hook 实现标签 用于标记hook的一个或多个实现 @hookspec def global_hook_func1(arg1, arg2): pass
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"
from myhookspec import hookimpl @hookimpl def global_hook_func1(arg1, arg2): print("global_hook_func1 in other.py, args:", arg1, arg2) return "other.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的实现 pm.register(myhookimpl) # 插件也可以是模块 pm.register(other) print(pm.hook.global_hook_func1(arg1="name", arg2="shouke"))
example.py运行结果如下
global_hook_func1 in other.py, args: name shouke
global_hook_func1 in myhookimpl.py, args: name shouke
['other.py', 'myhookimpl.py']
import pluggy hookspec = pluggy.HookspecMarker("myproject") @hookspec def mytest_hook_func1(arg1, arg2): pass
def mytest_hook_func1(arg1, arg2): print("global_hook_func1 in other.py, args:", arg1, arg2) return "other.py"
#!/usr/bin/env python # -*- coding:utf-8 -*- import inspect import pluggy import myhookspec import other class PytestPluginManager(pluggy.PluginManager): """ 插件类,实现不用@HookimplMarkerInstance装饰的函数也可以当做函数体 """ def parse_hookimpl_opts(self, plugin, name): # 规定免@hookimpl装饰的 hooks 函数总是以 mytest_打头,这样以避免访问非可读属性 if not name.startswith("mytest_"): return method = getattr(plugin, name) opts = super().parse_hookimpl_opts(plugin, name) # 考虑hook只能为函数(consider only actual functions for hooks) if not inspect.isroutine(method): return # 收集未被标记的,以mytest打头的hook函数,(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的实现 pm.register(other) pm.hook.mytest_hook_func1(arg1="addr", arg2="sz")
https://pypi.org/project/pluggy/
免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:mmqy2019@163.com进行举报,并提供相关证据,查实之后,将立刻删除涉嫌侵权内容。
猜你喜欢
内容介绍time模块datetime模块总结time模块time模块,也就是时间模块,用来进行一些与时间有关的操作。其使用方法为:importtimeprint(time.time())
python因为本身包含着丰富的库、模块以及各种函数,所以作用是非常大的,比如只需要利用一个简单的库——Albumentations,便可以轻松实现图像的简单处理,所以经常成为python图像处理。
yield的作用返回一个可以用来迭代(for循环)的生成器,它的应用场景通常为一个需要返回一系列值的,含有循环的函数中。
在编程语言中,将以某种方式(比如通过编号)组合起来的数据元素(如数字,字符串乃至其他数据结构)集合称为数据结构。在python中,最基本的数据结构为序列(sequence,简写为seq)。 所谓序列,指的是一块可存放多个值的连续内存空间,这些值按一定顺序排列,可通过每个值所在位置的编号(称为索引)访问它们。 为了更形象的认识序列,可以将它看做是一家旅店,那么店中的每个房间就如同序列存储数据的一个个内存空间,每个房间所特有的房间号就相当于索引值。也就是说,通过房间号(索引)我们可以找到这家旅店(序列)中_来自Python3 教程,w3cschool编程狮。
这篇文章给大家分享的是有关django与ajax怎样实现交互的内容,很多新手django与ajax交互可能不是很了解,因此分享给大家做个参考,有这方面学习需要的朋友接下来一起跟随小编看看吧。
成为群英会员,开启智能安全云计算之旅
立即注册Copyright © QY Network Company Ltd. All Rights Reserved. 2003-2020 群英 版权所有
增值电信经营许可证 : B1.B2-20140078 粤ICP备09006778号 域名注册商资质 粤 D3.1-20240008