Source code for pluggy._impl
"""
Hook implementation representation.
"""
from __future__ import annotations
from collections.abc import Callable
from collections.abc import Generator
from typing import Final
from typing import final
from typing import TypeAlias
from typing import TypeVar
from ._config import HookimplOpts
from ._decorators import varnames
from ._result import Result
_T = TypeVar("_T")
_Plugin: TypeAlias = object
_HookImplFunction: TypeAlias = Callable[..., _T | Generator[None, Result[_T], None]]
[docs]
@final
class HookImpl:
"""A hook implementation in a :class:`HookCaller`."""
__slots__ = (
"argnames",
"function",
"hookwrapper",
"kwargnames",
"optionalhook",
"opts",
"plugin",
"plugin_name",
"tryfirst",
"trylast",
"wrapper",
)
def __init__(
self,
plugin: _Plugin,
plugin_name: str,
function: _HookImplFunction[object],
hook_impl_opts: HookimplOpts,
) -> None:
""":meta private:"""
#: The hook implementation function.
self.function: Final = function
argnames, kwargnames = varnames(self.function)
#: The positional parameter names of ``function``.
self.argnames: Final = argnames
#: The keyword parameter names of ``function`` which declare defaults.
#: Keyword-only parameters are *not* included.
self.kwargnames: Final = kwargnames
#: The plugin which defined this hook implementation.
self.plugin: Final = plugin
#: The :class:`HookimplOpts` used to configure this hook implementation.
self.opts: Final = hook_impl_opts
#: The name of the plugin which defined this hook implementation.
self.plugin_name: Final = plugin_name
#: Whether the hook implementation is a :ref:`wrapper <hookwrapper>`.
self.wrapper: Final = hook_impl_opts["wrapper"]
#: Whether the hook implementation is an :ref:`old-style wrapper
#: <old_style_hookwrappers>`.
self.hookwrapper: Final = hook_impl_opts["hookwrapper"]
#: Whether validation against a hook specification is :ref:`optional
#: <optionalhook>`.
self.optionalhook: Final = hook_impl_opts["optionalhook"]
#: Whether to try to order this hook implementation :ref:`first
#: <callorder>`.
self.tryfirst: Final = hook_impl_opts["tryfirst"]
#: Whether to try to order this hook implementation :ref:`last
#: <callorder>`.
self.trylast: Final = hook_impl_opts["trylast"]
def __repr__(self) -> str:
return f"<HookImpl plugin_name={self.plugin_name!r}, plugin={self.plugin!r}>"