亚洲乱码中文字幕综合,中国熟女仑乱hd,亚洲精品乱拍国产一区二区三区,一本大道卡一卡二卡三乱码全集资源,又粗又黄又硬又爽的免费视频

Python?pluggy模塊的用法示例演示

 更新時間:2022年05月13日 11:54:16   作者:Redrose2100  
這篇文章主要介紹了Python?pluggy模塊的用法,pluggy提供了一個簡易便捷的插件系統(tǒng),可以做到插件與主題功能松耦合,pluggy?是pytest,tox,devpi的核心框架文中通過代碼示例演示給大家詳細介紹,需要的朋友參考下吧

1 pluggy 簡介

  • pluggy 作用:提供了一個簡易便捷的插件系統(tǒng),可以做到插件與主題功能松耦合
  • pluggy 是pytest,tox,devpi的核心框架

2 安裝

執(zhí)行如下命令即可

pip install pluggy

3 使用初體驗

import pluggy
# HookspecMarker 和 HookimplMarker 實質上是一個裝飾器帶參數的裝飾器類,作用是給函數增加額外的屬性設置
hookspec = pluggy.HookspecMarker("myproject")
hookimpl = pluggy.HookimplMarker("myproject")
# 定義自己的Spec,這里可以理解為定義接口類
class MySpec:
    # hookspec 是一個裝飾類中的方法的裝飾器,為此方法增額外的屬性設置,這里myhook可以理解為定義了一個接口
    @hookspec
    def myhook(self, arg1, arg2):
        pass
# 定義了一個插件
class Plugin_1:
    # 插件中實現了上面定義的接口,同樣這個實現接口的方法用 hookimpl裝飾器裝飾,功能是返回兩個參數的和
    @hookimpl
    def myhook(self, arg1, arg2):
        print("inside Plugin_1.myhook()")
        return arg1 + arg2
# 定義第二個插件
class Plugin_2:
    # 插件中實現了上面定義的接口,同樣這個實現接口的方法用 hookimpl裝飾器裝飾,功能是返回兩個參數的差
    @hookimpl
    def myhook(self, arg1, arg2):
        print("inside Plugin_2.myhook()")
        return arg1 - arg2
# 實例化一個插件管理的對象,注意這里的名稱要與文件開頭定義裝飾器的時候的名稱一致
pm = pluggy.PluginManager("myproject")
# 將自定義的接口類加到鉤子定義中去
pm.add_hookspecs(MySpec)
# 注冊定義的兩個插件
pm.register(Plugin_1())
pm.register(Plugin_2())
# 通過插件管理對象的鉤子調用方法,這時候兩個插件中的這個方法都會執(zhí)行,而且遵循后注冊先執(zhí)行即LIFO的原則,兩個插件的結果講義列表的形式返回
results = pm.hook.myhook(arg1=1, arg2=2)
print(results)

執(zhí)行結果如下:

inside Plugin_2.myhook()
inside Plugin_1.myhook()
[-1, 3]

4 詳解解釋

從代碼上看比較繞,其實通俗一點理解,其實挺簡單的,可以理解為首先定義一個接口類,然后定義很多插件類,插件類想要多少就定義多少, 接口類中要定義接口,上面的例子值定義了一個接口,其實可以定義很多接口,在每個插件類中需要選擇接口類中的接口去實現,當然也不需要每個 都需要去實現,可以根據自己的需要有選擇的去實現。

舉個例子:

比如定義了一個接口類,接口類中定義了10個接口,同時定義了3個類,這三個類分別實現了接口類中3個接口,6個接口和10個接口,然后實例化一個插件管理的對象,實例化對象將接口類加入定義模板中,然后去注冊這三個類,注冊之后,就可以通過插件管理對象的鉤子去調用接口類中的每個方法了,比如調用頭三個方法,因為每個插件中都實現了,所以就會有三個結果,調用后面4-6的接口時,因為只有兩個插件實現了,所以只會有兩個結果返回,調用7-10的接口因為只有一個插件類實現了,所以就會只有一個結果返回,這樣插件使用起來就非常靈活,可以真正做到“熱插拔”

下面用代碼示例演示:

import pluggy
# HookspecMarker 和 HookimplMarker 實質上是一個裝飾器帶參數的裝飾器類,作用是給函數增加額外的屬性設置
hookspec = pluggy.HookspecMarker("myproject")
hookimpl = pluggy.HookimplMarker("myproject")
# 定義自己的Spec,這里可以理解為定義接口類
class MySpec:
    # hookspec 是一個裝飾類中的方法的裝飾器,為此方法增額外的屬性設置,這里myhook可以理解為定義了3個接口
    @hookspec
    def myhook1(self, arg1, arg2):
        pass
    @hookspec
    def myhook2(self, arg1, arg2):
        pass
    @hookspec
    def myhook3(self, arg1, arg2):
        pass
# 定義了一個插件
class Plugin_1:
    # 插件中實現了上面定義的接口,同樣這個實現接口的方法用 hookimpl裝飾器裝飾,功能是返回兩個參數的和
    @hookimpl
    def myhook1(self, arg1, arg2):
        print("inside Plugin_1.myhook1()")
        return arg1 + arg2
    @hookimpl
    def myhook2(self, arg1, arg2):
        print("inside Plugin_1.myhook2()")
        return arg1 + arg2 +1
    @hookimpl
    def myhook4(self, arg1, arg2):
        print("inside Plugin_1.myhook4()")
        return arg1 + arg2 + 2
# 定義第二個插件
class Plugin_2:
    # 插件中實現了上面定義的接口,同樣這個實現接口的方法用 hookimpl裝飾器裝飾,功能是返回兩個參數的差
    @hookimpl
    def myhook1(self, arg1, arg2):
        print("inside Plugin_2.myhook1()")
        return arg1 - arg2
    @hookimpl
    def myhook2(self, arg1, arg2):
        print("inside Plugin_2.myhook2()")
        return arg1 - arg2 -1
    @hookimpl
    def myhook3(self, arg1, arg2):
        print("inside Plugin_2.myhook3()")
        return arg1 - arg2 -2
# 實例化一個插件管理的對象,注意這里的名稱要與文件開頭定義裝飾器的時候的名稱一致
pm = pluggy.PluginManager("myproject")
# 將自定義的接口類加到鉤子定義中去
pm.add_hookspecs(MySpec)
# 注冊定義的兩個插件
pm.register(Plugin_1())
pm.register(Plugin_2())
# 通過插件管理對象的鉤子調用方法,這時候兩個插件中的這個方法都會執(zhí)行,而且遵循后注冊先執(zhí)行即LIFO的原則,兩個插件的結果講義列表的形式返回
results = pm.hook.myhook1(arg1=1, arg2=2)
print(results)
results = pm.hook.myhook2(arg1=1, arg2=2)
print(results)
results = pm.hook.myhook3(arg1=1, arg2=2)
print(results)
results = pm.hook.myhook4(arg1=1, arg2=2)
print(results)

執(zhí)行結果如下:

inside Plugin_2.myhook1()
inside Plugin_1.myhook1()
[-1, 3]
inside Plugin_2.myhook2()
inside Plugin_1.myhook2()
[-2, 4]
inside Plugin_2.myhook3()
[-3]
inside Plugin_1.myhook4()
[5]

從上面的代碼示例可以看出:

  • 1)myhook1 和 myhook2 因為兩個插件都實現了,所有返回兩個結果,而且是倒序的
  • 2)myhook3 因為只有插件2實現了,所以只有一個返回結果
  • 3)myhook4 在spec中未定義,這里卻也有結果,目前理解可能是pluggy的bug,待后續(xù)看源碼后解釋

5 HookspeckMarker裝飾器支持傳入一些特定的參數

當傳入firstresult=True時,獲取第一個plugin執(zhí)行結果后就停止繼續(xù)執(zhí)行

import pluggy
# HookspecMarker 和 HookimplMarker 實質上是一個裝飾器帶參數的裝飾器類,作用是給函數增加額外的屬性設置
hookspec = pluggy.HookspecMarker("myproject")
hookimpl = pluggy.HookimplMarker("myproject")
# 定義自己的Spec,這里可以理解為定義接口類
class MySpec:
    # hookspec 是一個裝飾類中的方法的裝飾器,為此方法增額外的屬性設置,這里myhook可以理解為定義了一個接口
    @hookspec(firstresult=True)
    def myhook(self, arg1, arg2):
        pass
# 定義了一個插件
class Plugin_1:
    # 插件中實現了上面定義的接口,同樣這個實現接口的方法用 hookimpl裝飾器裝飾,功能是返回兩個參數的和
    @hookimpl
    def myhook(self, arg1, arg2):
        print("inside Plugin_1.myhook()")
        return arg1 + arg2
# 定義第二個插件
class Plugin_2:
    # 插件中實現了上面定義的接口,同樣這個實現接口的方法用 hookimpl裝飾器裝飾,功能是返回兩個參數的差
    @hookimpl
    def myhook(self, arg1, arg2):
        print("inside Plugin_2.myhook()")
        return arg1 - arg2
# 實例化一個插件管理的對象,注意這里的名稱要與文件開頭定義裝飾器的時候的名稱一致
pm = pluggy.PluginManager("myproject")
# 將自定義的接口類加到鉤子定義中去
pm.add_hookspecs(MySpec)
# 注冊定義的兩個插件
pm.register(Plugin_1())
pm.register(Plugin_2())
# 通過插件管理對象的鉤子調用方法,這時候兩個插件中的這個方法都會執(zhí)行,而且遵循后注冊先執(zhí)行即LIFO的原則,兩個插件的結果講義列表的形式返回
results = pm.hook.myhook(arg1=1, arg2=2)
print(results)

執(zhí)行結果如下:

inside Plugin_2.myhook()
-1

6 HookImplMarker裝飾器也支持傳入一些特定的參數

常用的有tryfirst和trylast以及hookwrapper

  • 當傳入tryfirst=True時,表示這個類的hook函數會優(yōu)先執(zhí)行,其他的仍然按照后進先出的順序執(zhí)行
import pluggy
# HookspecMarker 和 HookimplMarker 實質上是一個裝飾器帶參數的裝飾器類,作用是給函數增加額外的屬性設置
hookspec = pluggy.HookspecMarker("myproject")
hookimpl = pluggy.HookimplMarker("myproject")
# 定義自己的Spec,這里可以理解為定義接口類
class MySpec:
    # hookspec 是一個裝飾類中的方法的裝飾器,為此方法增額外的屬性設置,這里myhook可以理解為定義了一個接口
    @hookspec
    def myhook(self, arg1, arg2):
        pass
# 定義了一個插件
class Plugin_1:
    # 插件中實現了上面定義的接口,同樣這個實現接口的方法用 hookimpl裝飾器裝飾,功能是返回兩個參數的和
    @hookimpl(tryfirst=True)
    def myhook(self, arg1, arg2):
        print("inside Plugin_1.myhook()")
        return arg1 + arg2
# 定義第二個插件
class Plugin_2:
    # 插件中實現了上面定義的接口,同樣這個實現接口的方法用 hookimpl裝飾器裝飾,功能是返回兩個參數的差
    @hookimpl
    def myhook(self, arg1, arg2):
        print("inside Plugin_2.myhook()")
        return arg1 - arg2
# 定義第三個插件
class Plugin_3:
    # 插件中實現了上面定義的接口,同樣這個實現接口的方法用 hookimpl裝飾器裝飾,功能是返回兩個參數的差
    @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())
# 通過插件管理對象的鉤子調用方法,這時候兩個插件中的這個方法都會執(zhí)行,而且遵循后注冊先執(zhí)行即LIFO的原則,兩個插件的結果講義列表的形式返回
results = pm.hook.myhook(arg1=1, arg2=2)
print(results)

執(zhí)行結果讓如下:

inside Plugin_1.myhook()
inside Plugin_3.myhook()
inside Plugin_2.myhook()
[3, 9, -1]

  • 當傳入trylast=True,表示當前插件的hook函數會盡可能晚的執(zhí)行,其他的仍然按照后進先出的順序執(zhí)行
import pluggy
# HookspecMarker 和 HookimplMarker 實質上是一個裝飾器帶參數的裝飾器類,作用是給函數增加額外的屬性設置
hookspec = pluggy.HookspecMarker("myproject")
hookimpl = pluggy.HookimplMarker("myproject")
# 定義自己的Spec,這里可以理解為定義接口類
class MySpec:
    # hookspec 是一個裝飾類中的方法的裝飾器,為此方法增額外的屬性設置,這里myhook可以理解為定義了一個接口
    @hookspec
    def myhook(self, arg1, arg2):
        pass
# 定義了一個插件
class Plugin_1:
    # 插件中實現了上面定義的接口,同樣這個實現接口的方法用 hookimpl裝飾器裝飾,功能是返回兩個參數的和
    @hookimpl()
    def myhook(self, arg1, arg2):
        print("inside Plugin_1.myhook()")
        return arg1 + arg2
# 定義第二個插件
class Plugin_2:
    # 插件中實現了上面定義的接口,同樣這個實現接口的方法用 hookimpl裝飾器裝飾,功能是返回兩個參數的差
    @hookimpl(trylast=True)
    def myhook(self, arg1, arg2):
        print("inside Plugin_2.myhook()")
        return arg1 - arg2
# 定義第三個插件
class Plugin_3:
    # 插件中實現了上面定義的接口,同樣這個實現接口的方法用 hookimpl裝飾器裝飾,功能是返回兩個參數的差
    @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())
# 通過插件管理對象的鉤子調用方法,這時候兩個插件中的這個方法都會執(zhí)行,而且遵循后注冊先執(zhí)行即LIFO的原則,兩個插件的結果講義列表的形式返回
results = pm.hook.myhook(arg1=1, arg2=2)
print(results)

執(zhí)行結果如下:

inside Plugin_3.myhook()
inside Plugin_1.myhook()
inside Plugin_2.myhook()
[9, 3, -1]

  • 當傳入hookwrapper=True時,需要在這個plugin中實現一個yield,plugin先執(zhí)行yield

之前的代碼,然后去執(zhí)行其他的pluggin,然后再回來執(zhí)行yield之后的代碼,同時通過yield可以 獲取到其他插件執(zhí)行的結果

import pluggy
# HookspecMarker 和 HookimplMarker 實質上是一個裝飾器帶參數的裝飾器類,作用是給函數增加額外的屬性設置
hookspec = pluggy.HookspecMarker("myproject")
hookimpl = pluggy.HookimplMarker("myproject")
# 定義自己的Spec,這里可以理解為定義接口類
class MySpec:
    # hookspec 是一個裝飾類中的方法的裝飾器,為此方法增額外的屬性設置,這里myhook可以理解為定義了一個接口
    @hookspec
    def myhook(self, arg1, arg2):
        pass
# 定義了一個插件
class Plugin_1:
    # 插件中實現了上面定義的接口,同樣這個實現接口的方法用 hookimpl裝飾器裝飾,功能是返回兩個參數的和
    @hookimpl()
    def myhook(self, arg1, arg2):
        print("inside Plugin_1.myhook()")
        return arg1 + arg2
# 定義第二個插件
class Plugin_2:
    # 插件中實現了上面定義的接口,同樣這個實現接口的方法用 hookimpl裝飾器裝飾,功能是返回兩個參數的差
    @hookimpl(hookwrapper=True)
    def myhook(self, arg1, arg2):
        print("inside Plugin_2.myhook() before yield...")
        output=yield
        result=output.get_result()
        print(result)
        print("inside Plugin_2.myhook() after yield...")
# 定義第三個插件
class Plugin_3:
    # 插件中實現了上面定義的接口,同樣這個實現接口的方法用 hookimpl裝飾器裝飾,功能是返回兩個參數的差
    @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())
# 通過插件管理對象的鉤子調用方法,這時候兩個插件中的這個方法都會執(zhí)行,而且遵循后注冊先執(zhí)行即LIFO的原則,兩個插件的結果講義列表的形式返回
results = pm.hook.myhook(arg1=1, arg2=2)
print(results)

執(zhí)行結果如下:

inside Plugin_2.myhook() before yield...
inside Plugin_3.myhook()
inside Plugin_1.myhook()
[9, 3]
inside Plugin_2.myhook() after yield...
[9, 3]

到此這篇關于Python pluggy模塊的用法的文章就介紹到這了,更多相關Python pluggy模塊內容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關文章希望大家以后多多支持腳本之家!

相關文章

  • python連接access數據庫兩種方式總結

    python連接access數據庫兩種方式總結

    這篇文章主要介紹了python連接access數據庫兩種方式的相關資料,SQLAlchemy使用access方言進行連接,而pyodbc則通過pyodbc模塊實現連接,文章還提供了連接代碼示例,需要的朋友可以參考下
    2025-02-02
  • 使用Python編程分析火爆全網的魷魚游戲豆瓣影評

    使用Python編程分析火爆全網的魷魚游戲豆瓣影評

    本文來為大家介紹如何使用Python爬取影評的操作,主要是爬取《魷魚游戲》在豆瓣上的一些影評,對數據做一些簡單的分析,用數據的角度重新審視下這部劇,有需要的朋友可以借鑒參考下
    2021-10-10
  • Python利用xmltodict實現字典和xml互相轉換的示例代碼

    Python利用xmltodict實現字典和xml互相轉換的示例代碼

    xmltodict是一個Python第三方庫,用于處理XML數據,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2024-12-12
  • Python Matplotlib 實現3D繪圖詳解

    Python Matplotlib 實現3D繪圖詳解

    Matplotlib在二維繪圖的基礎上,構建了一部分較為實用的3D繪圖程序包。本文將為大家詳細介紹通過調用該程序包接口繪制 3D散點圖、3D曲面圖、3D線框圖。感興趣的同學可以了解一下
    2021-11-11
  • python的pygal模塊繪制反正切函數圖像方法

    python的pygal模塊繪制反正切函數圖像方法

    在本篇文章中我們給大家整理了關于如何用python的pygal模塊繪制反正切函數圖像的知識點內容,有需要的朋友們可以學習下。
    2019-07-07
  • python識別驗證碼的思路及解決方案

    python識別驗證碼的思路及解決方案

    在本篇內容里小編給大家整理的是一篇關于python識別驗證碼的思路及解決方案,有需要的朋友們可以參考下。
    2020-09-09
  • python爬蟲實現爬取同一個網站的多頁數據的實例講解

    python爬蟲實現爬取同一個網站的多頁數據的實例講解

    在本篇文章里小編給大家整理了一篇關于python爬蟲實現爬取同一個網站的多頁數據的實例內容,有興趣的朋友們可以學習參考下。
    2021-01-01
  • python函數的5種參數詳解

    python函數的5種參數詳解

    昨天看《Python核心編程》的時候,剛好看到了函數部分,于是順勢將目前接觸到的集中參數類型都總結一下吧^^
    2017-02-02
  • Python3最長回文子串算法示例

    Python3最長回文子串算法示例

    這篇文章主要介紹了Python3最長回文子串算法,結合實例形式分析了暴力算法及動態(tài)規(guī)劃算法判斷最長回文子串的相關操作技巧,需要的朋友可以參考下
    2019-03-03
  • Python自然語言處理使用spaCy庫進行文本預處理

    Python自然語言處理使用spaCy庫進行文本預處理

    這篇文章主要為大家介紹了Python自然語言處理使用spaCy庫進行文本預處理,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-05-05

最新評論