【原文链接】Pytest----pluggy源码解读基础准备
解读pluggy源码,直接使用pytest环境中安装的pluggy即可,比如这里安装的pluggy版本是1.0.0,为了更好的理解源码,这里首先使用如下应用代码作为应用实例,从如下代码中可以分析出,pluggy的使用步骤主要包括一下几个步骤:
 1) HookspecMarker类实例化
 2) HookimplMarker类实例化
 3) 定义一个接口类,接口类中的函数上使用1)中的实例化作为装饰器装饰
 4) 定义一个实现类,实现类中的函数上使用2)中的实例化作为装饰器装饰
 5) PluginManager类实例化
 6) 对5)中的实例调用 add_hookspecs方法
 7) 使用5)中的实例调用注册方法
 8) 通过5)中实例的hook属性调用接口方法。
import pluggy
hookspec = pluggy.HookspecMarker("myproject")
hookimpl = pluggy.HookimplMarker("myproject")
class MySpec:
    @hookspec
    def myhook(self, arg1, arg2):
        pass
class Plugin_1:
    @hookimpl()
    def myhook(self, arg1, arg2):
        print("in Plugin_1.myhook()")
        return arg1 + arg2
class Plugin_2:
    @hookimpl(hookwrapper=True)
    def myhook(self, arg1, arg2):
        print("in Plugin_2.myhook() before yield...")
        output=yield
        result=output.get_result()
        print("in Plugin_2.myhook() after yield...")
        print(result)
class Plugin_3:
    @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())
results = pm.hook.myhook(arg1=1, arg2=2)
print("after all run ...")
print(results)
为更好的定位跳转,可以在pycharm中打开上述测试代码,并配置解释器,然后即可在External Library中找到pluggy的源码了,如下图所示。
 
 pluggy 源码只有以下7个文件
pluggy
  |--------__init__.py
  |--------_caller.py
  |--------_hooks.py
  |--------_manager.py
  |--------_result.py
  |--------_tracing.py
  |--------_version.py
其中__init__.py文件代码如下,即这里通过__all__限定了pluggy外部只允许使用PluginManager、PluginValidationError、HookCallError、HookspecMarker、HookimplMarker这五个类。
try:
    from ._version import version as __version__
except ImportError:
    # broken installation, we don't even try
    # unknown only works because we do poor mans version compare
    __version__ = "unknown"
__all__ = [
    "PluginManager",
    "PluginValidationError",
    "HookCallError",
    "HookspecMarker",
    "HookimplMarker",
]
from ._manager import PluginManager, PluginValidationError
from ._callers import HookCallError
from ._hooks import HookspecMarker, HookimplMarker
而_version.py中的内容如下,这里是设置pluggy版本号的。
# coding: utf-8
# file generated by setuptools_scm
# don't change, don't track in version control
version = '1.0.0'
version_tuple = (1, 0, 0)
然后就可以在pycharm中对pluggy应用实例脚本中通过按住Ctrl键,然后鼠标点击即可跳转到对应的函数定义了,比如如下图所示

然后就可以根据pluggy的应用实例代码对pluggy源码进行解析了。



















