前言
本篇将详细分析如何通过PluginManager.hook
调用plugin实现。
个人拙见,有错请各位指出。
如果的我的文章对您有帮助,不符动动您的金手指给个Star,予人玫瑰,手有余香,不胜感激。 GitHub
pytest-pluggy深挖hook调用逻辑
前面介绍了不少hook的调用逻辑,但是还有个hook_execute没接上,这里来完整的分析pm.hook.calculate(a=2, b=3)的执行过程
每当我们调用pm.hook.xxx(**kwargs)的时候,实际上是调用了_HookCaller对象的__call__方法
def __call__(self, *args, **kwargs):
if args:
raise TypeError("hook calling supports only keyword arguments")
assert not self.is_historic()
if self.spec and self.spec.argnames:
notincall = (
set(self.spec.argnames) - set(["__multicall__"]) - set(kwargs.keys())
)
if notincall:
warnings.warn(
"Argument(s) {} which are declared in the hookspec "
"can not be found in this hook call".format(tuple(notincall)),
stacklevel=2,
)
return self._hookexec(self, self.get_hookimpls(), kwargs)
- 从
__call__
的代码可以看到核心逻辑是最后一行的self._hookexec
,我们可以发现这是_HookCaller的一个属性