广告
返回顶部
首页 > 资讯 > 后端开发 > Python >Python pluggy框架使用示例代码
  • 698
分享到

Python pluggy框架使用示例代码

2024-04-02 19:04:59 698人浏览 独家记忆

Python 官方文档:入门教程 => 点击学习

摘要

目录实践环境例1 注册类函数为插件函数例2 注册模块函数为插件函数myhookspec.pymyhookimpl.pyother.pyexample.py例3:自定义插件类实现hoo

代码为例进行说明

实践环境

python 3.6.5

pluggy 0.13.0

例1 注册类函数为插件函数

#!/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

例2 注册模块函数为插件函数

myhookspec.pymyhookimpl.pyother.pyexample.py位于同一包目录下

myhookspec.py

import pluggy
hookspec = pluggy.HookspecMarker("myproject")  # hook 标签 用于标记hook
hookimpl = pluggy.HookimplMarker("myproject")  # hook 实现标签 用于标记hook的一个或多个实现
@hookspec
def global_hook_func1(arg1, arg2):
    pass

myhookimpl.py

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"

other.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"

example.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']

例3:自定义插件类实现hook函数免@hookimpl装饰器

myhookspec.py

import pluggy
hookspec = pluggy.HookspecMarker("myproject")
@hookspec
def mytest_hook_func1(arg1, arg2):
    pass

other.py

def mytest_hook_func1(arg1, arg2):
    print("global_hook_func1 in other.py, args:", arg1, arg2)
    return "other.py"

example.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/

到此这篇关于Python pluggy框架基础用法总结的文章就介绍到这了,更多相关Python pluggy用法内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

--结束END--

本文标题: Python pluggy框架使用示例代码

本文链接: https://www.lsjlt.com/news/117983.html(转载时请注明来源链接)

有问题或投稿请发送至: 邮箱/279061341@qq.com    QQ/279061341

本篇文章演示代码以及资料文档资料下载

下载Word文档到电脑,方便收藏和打印~

下载Word文档
猜你喜欢
  • Python pluggy框架使用示例代码
    目录实践环境例1 注册类函数为插件函数例2 注册模块函数为插件函数myhookspec.pymyhookimpl.pyother.pyexample.py例3:自定义插件类实现hoo...
    99+
    2022-11-11
  • Python爬虫教程使用Scrapy框架爬取小说代码示例
    目录Scrapy框架简单介绍创建Scrapy项目创建Spider爬虫Spider爬虫提取数据items.py代码定义字段fiction.py代码提取数据pipelines.py代码保...
    99+
    2022-11-12
  • SpringBoot框架整合SwaggerUI的示例代码
    整合swagger进行模块测试 注意事项:为方便SpringBoot更好的整合Swagger,需要专门放置在一个模块中(maven子工程) 创建公共模块,整合swagger,为了所有...
    99+
    2022-11-13
  • 使用Python的Twisted框架编写非阻塞程序的代码示例
    先来看一段代码: # ~*~ Twisted - A Python tale ~*~ from time import sleep # Hello, I'm a developer and I m...
    99+
    2022-06-04
    示例 框架 代码
  • PHP开发框架laravel代码提示示例解析
    public function getTable() { return $this->table Str::snake(Str::pluralStudly(class_bas...
    99+
    2022-11-13
  • 用ReactJS和Python的Flask框架编写留言板的代码示例
    近期要在生产环境上使用react,所以,自己学习了一下,写了一个简单的留言板小程序。完整的代码可以到这里下载:message-board Use 前端使用React,然后还有Bootstrap和jQuery...
    99+
    2022-06-04
    示例 框架 留言板
  • Python爬虫框架scrapy的使用示例
    这篇文章主要介绍了Python爬虫框架scrapy的使用示例,具有一定借鉴价值,感兴趣的朋友可以参考下,希望大家阅读完这篇文章之后大有收获,下面让小编带着大家一起了解一下。python可以做什么Python是一种编程语言,内置了许多有效的工...
    99+
    2023-06-14
  • 集合框架(Collections Framework)详解及代码示例
    简介集合和数组的区别:数组存储基础数据类型,且每一个数组都只能存储一种数据类型的数据,空间不可变。集合存储对象,一个集合中可以存储多种类型的对象。空间可变。严格地说,集合是存储对象的引用,每个对象都称为集合的元素。根据存储时数据结构的不同,...
    99+
    2023-05-30
    java 集合框架 fram
  • swoole框架的使用示例
    这篇文章将为大家详细讲解有关swoole框架的使用示例,小编觉得挺实用的,因此分享给大家做个参考,希望大家阅读完这篇文章后可以有所收获。正文swoole有两个部分。 一个是PHP扩展,用C开发的,这是核心。 另一个是框架,像yii、TP、L...
    99+
    2023-06-14
  • SpringMVC框架实现上传图片的示例代码
    一.创建图片虚拟目录在上传图片之前,先要设置虚拟目录(以IDEA为例) 打开工具栏的运行配置Edit Configurations 添加物理目录和并设置虚拟目录路径添加img图片在img文件夹内测试访问:http://localhost...
    99+
    2023-05-31
    spring mvc 上传
  • 基于SSM框架之个人相册示例代码
    学习了一阵子的SSM框架,一直在各种博客,简书,慕课网学习,最后终于自己撸出来一个简单的个人相册。项目的演示效果:开发的工具及环境: IntelliJ IDEA: 2016 Maven :3.0x Hbuilder(前端部分,可以用记...
    99+
    2023-05-31
    ssm框架
  • Flask框架运用Ajax实现数据交互的示例代码
    目录前后端发送字符串前后端发送JSON数据发送数据并携带token收发JSON格式字符串使用Ajax技术网页应用能够快速地将增量更新呈现在用户界面上,而不需要重载刷新整个页面,这使得...
    99+
    2022-11-13
    Flask Ajax数据交互 Flask Ajax数据 Flask 数据交互 Flask Ajax
  • 使用flexible.js框架的示例分析
    这篇文章主要介绍使用flexible.js框架的示例分析,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!基本概念1、视窗viewport可能写过移动端的朋友就知道viewport是什么...
    99+
    2022-10-19
  • GolangGin框架实现文件下载功能的示例代码
    目录Layui框架实现文件上传Gin框架获取前端上传的文件Gin框架的文件下载Layui框架实现文件上传 基本的思路就是随便创建一个元素,然后使用layui的upload组件对创建的...
    99+
    2022-11-12
  • python使用mysql数据库示例代码
    一,安装mysql 如果是windows 用户,mysql 的安装非常简单,直接下载安装文件,双击安装文件一步一步进行操作即可。 Linux 下的安装可能会更加简单,除了下载安装包进行安装外,一般的li...
    99+
    2022-06-04
    示例 代码 数据库
  • 使用Python实现tail的示例代码
    目录前记1.第一版--从文件尾部读取实时数据2.第二版--实现tail -f3.第三版--优雅的读取输出日志文件前记 tail是一个常用的Linux命令, 它可以打印文件的后面n行数...
    99+
    2023-03-01
    Python实现tail Python tail
  • 重定向Shell框架输出的Java代码示例是什么?
    在Java开发中,我们经常需要使用Shell框架来执行一些命令行操作。然而,当我们在Shell框架中执行命令时,我们经常需要将输出重定向到Java程序中,以便对输出进行处理。在本文中,我们将介绍如何使用Java代码来重定向Shell框架输...
    99+
    2023-06-14
    重定向 shell 框架
  • Python调用pytdx的代码示例
    目录安装pytdx简单示范一、基本行情接口索引二、扩展行情接口API安装pytdx pip install pytdx 简单示范 from pytdx.hq import TdxH...
    99+
    2023-01-28
    Python调用pytdx Python pytdx
  • Android路由框架ARouter的使用示例
    目录一、添加依赖和初始化框架 1、添加依赖 1.1、java版本的依赖1.2、kotlin版本的依赖2、初始化SDK二、ARouter的简单使用 1、界面跳转 1.1、Activit...
    99+
    2022-11-12
  • PythonScrapy爬虫框架使用示例浅析
    目录示例具体说明Scrapy框架爬虫使用代理ip示例 下面是一个简单的Python爬虫Scrapy框架代码示例,该代码可以抓取百度搜索结果页面中指定关键字的链接和标题等信息: imp...
    99+
    2023-05-20
    Python Scrapy Python Scrapy爬虫框架
软考高级职称资格查询
编程网,编程工程师的家园,是目前国内优秀的开源技术社区之一,形成了由开源软件库、代码分享、资讯、协作翻译、讨论区和博客等几大频道内容,为IT开发者提供了一个发现、使用、并交流开源技术的平台。
  • 官方手机版

  • 微信公众号

  • 商务合作