zoukankan      html  css  js  c++  java
  • 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
    ```
  • 相关阅读:
    IE6下div遮盖select的最优解决方案
    jQuery一些常用特效方法使用实例
    你用什么工具开发JavaScript?
    抛弃jQuery 深入原生的JavaScript
    在JavaScript中实现yield,实用简洁实现方式。
    jquery复选框checkbox实现删除
    一系列JavaScript的基础工具
    jQuery一些常用特效方法使用实例
    JavaScript 文件上传类型判断
    Java大文件分片上传/多线程上传功能
  • 原文地址:https://www.cnblogs.com/EmptyRabbit/p/12377676.html
Copyright © 2011-2022 走看看