日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學(xué)無(wú)先后,達(dá)者為師

網(wǎng)站首頁(yè) 編程語(yǔ)言 正文

Python?pluggy框架使用示例代碼_python

作者:授客 ? 更新時(shí)間: 2022-07-07 編程語(yǔ)言

代碼為例進(jìn)行說(shuō)明

實(shí)踐環(huán)境

Python 3.6.5

pluggy 0.13.0

例1 注冊(cè)類(lèi)函數(shù)為插件函數(shù)

#!/usr/bin/env python
# -*- coding:utf-8 -*-
import pluggy
hookspec = pluggy.HookspecMarker("myproject")  # hook 標(biāo)簽 用于標(biāo)記hook
hookimpl = pluggy.HookimplMarker("myproject")  # hook 實(shí)現(xiàn)標(biāo)簽 用于標(biāo)記hook的一個(gè)或多個(gè)實(shí)現(xiàn)
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
# 插件類(lèi)
class Plugin_1(object):
    """hook實(shí)現(xiàn)類(lèi)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實(shí)現(xiàn)類(lèi)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函數(shù)聲明)
pm.add_hookspecs(MySpec)
# 注冊(cè)插件(hook函數(shù)實(shí)現(xiàn))
pm.register(Plugin_1())
pm.register(Plugin_2())
# 調(diào)用自定義hook
results = pm.hook.myhook(arg1=1, arg2=2) # 調(diào)用兩個(gè)插件類(lèi)中的同名hook函數(shù) # 后注冊(cè)的插件中的函數(shù)會(huì)先被調(diào)用
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")

運(yùn)行結(jié)果

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 注冊(cè)模塊函數(shù)為插件函數(shù)

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

myhookspec.py

import pluggy
hookspec = pluggy.HookspecMarker("myproject")  # hook 標(biāo)簽 用于標(biāo)記hook
hookimpl = pluggy.HookimplMarker("myproject")  # hook 實(shí)現(xiàn)標(biāo)簽 用于標(biāo)記hook的一個(gè)或多個(gè)實(shí)現(xiàn)
@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的實(shí)現(xiàn)
pm.register(myhookimpl) # 插件也可以是模塊
pm.register(other)
print(pm.hook.global_hook_func1(arg1="name", arg2="shouke"))

example.py運(yùn)行結(jié)果如下

global_hook_func1 in other.py, args: name shouke
global_hook_func1 in myhookimpl.py, args: name shouke
['other.py', 'myhookimpl.py']

例3:自定義插件類(lèi)實(shí)現(xiàn)hook函數(shù)免@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):
    """
    插件類(lèi),實(shí)現(xiàn)不用@HookimplMarkerInstance裝飾的函數(shù)也可以當(dāng)做函數(shù)體
    """
    def parse_hookimpl_opts(self, plugin, name):
        # 規(guī)定免@hookimpl裝飾的 hooks 函數(shù)總是以 mytest_打頭,這樣以避免訪問(wèn)非可讀屬性
        if not name.startswith("mytest_"):
            return
        method = getattr(plugin, name)
        opts = super().parse_hookimpl_opts(plugin, name)
        # 考慮hook只能為函數(shù)(consider only actual functions for hooks)
        if not inspect.isroutine(method):
            return
        # 收集未被標(biāo)記的,以mytest打頭的hook函數(shù),(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的實(shí)現(xiàn)
pm.register(other)
pm.hook.mytest_hook_func1(arg1="addr", arg2="sz")

參考連接

https://pypi.org/project/pluggy/

原文鏈接:https://www.cnblogs.com/shouke/p/14940707.html

欄目分類(lèi)
最近更新