Wording in `mypy.plugin.Plugin.get_method[_signature]_hook` docstring
Documentation
The docstring of these plugin hook methods currently say:
https://github.com/python/mypy/blob/057508b4cb405fbc22e26b44f764b142352fcce5/mypy/plugin.py#L647-L648
...
https://github.com/python/mypy/blob/057508b4cb405fbc22e26b44f764b142352fcce5/mypy/plugin.py#L664
I understand this to mean that the argument to fullname will be "__main__.Base.method", because __main__.Base defines method.
However, this doesn't seem to be the case. Setting up the same example in the docstring:
-
mypy.ini[mypy] plugins = plugin.py files = test.py -
plugin.pyfrom mypy.plugin import Plugin def plugin(version): return TestPlugin class TestPlugin(Plugin): def get_method_signature_hook(self, fullname): if fullname.startswith("test."): print(f"Hook will be called with `{fullname}`") -
test.pyfrom typing import Any class Base: def method(self, arg: Any) -> Any: ... class Derived(Base): ... var: Derived var.method(42)
$ mypy
Hook will be called with `test.Derived.method`
I installed as far back as mypy 0.9x and it was the same behaviour as described above, displaying test.Derived.method (not test.Base.method).
Is there something wrong with the docstring (perhaps from outdated behaviour that no longer applies), or have I misunderstood something?
Hm, this is problematic. IIRC the intention was to actually pass Base names there. But changing the logic now may be risky, as many plugins will break. @JukkaL what do you think?
We could provide a flag to enable the new behavior to make it easier for plugins to switch to the new semantics. We'd then switch the default for the flag after at least a few releases. We don't promise that the plugin system remains backward compatible.