【原文链接】Pluggy源码解读----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源码进行解析了。