pytest-dev / pluggy

A minimalist production ready plugin system
https://pluggy.readthedocs.io/en/latest/
MIT License
1.24k stars 121 forks source link

Question about default values in hook implementation #442

Open krassowski opened 1 year ago

krassowski commented 1 year ago

I encountered a somewhat confusing behaviour in https://github.com/python-lsp/python-lsp-server/issues/439 were I observe that the hook implementation default arguments always take precedence over the values passed to the hook at runtime. This can be reproduced using the following snippet:

import pluggy

hookspec = pluggy.HookspecMarker("test")
hookimpl = pluggy.HookimplMarker("test")

class MySpec:

    @hookspec
    def myhook(self, arg1, arg2):
        pass

class Plugin_1:

    @hookimpl
    def myhook(self, arg1, arg2=0):
        return arg1 + arg2

pm = pluggy.PluginManager("test")
pm.add_hookspecs(MySpec)
pm.register(Plugin_1())
results = pm.hook.myhook(arg1=1, arg2=2)
print(results)

which prints [1] rather than [3] which I would expect. I see this issue in Python 3.8 and 3.11.

I do not see any explanation of this behaviour, which appears highly unexpected on https://pluggy.readthedocs.io/en/latest/ but I also do not see any hook implementations with default values there either. As such I am confused as to whether this is intended behaviour or not. Which is it?

RonnyPfannschmidt commented 1 year ago

As of now There's no support for default values at all, thus never use them in Hook impls