Closed
Description
Bug report
import inspect def test_1(): class FooStaticmethod: @staticmethod def __call__(cls, s, l, t): return t instance = FooStaticmethod() instance(1, 2, 3, 4) # Success call with 4 args assert list(inspect.signature(instance).parameters.keys()) == ['cls', 's', 'l', 't'] def test_2(): class FooClassmethod: @classmethod def __call__(cls, s, l, t): return t instance = FooClassmethod() instance(1, 2, 3) # Success call with 4 args assert list(inspect.signature(instance).parameters.keys()) == ['s', 'l', 't'] def test_3(): class FooStaticmethod: @staticmethod def __call__(): return None instance = FooStaticmethod() instance() assert list(inspect.signature(instance).parameters.keys()) == []
Your environment
CPython versions tested on:
- Python 3.10.9 (tags/v3.10.9:1dd9be6, Dec 6 2022, 20:01:21) [MSC v.1934 64 bit (AMD64)] on win32
- Python 3.11.1 (tags/v3.11.1:a7a450f, Dec 6 2022, 19:58:39) [MSC v.1934 64 bit (AMD64)] on win32
Possible fix
The problem is that we are calling _signature_from_callable
twice with skip_bound_arg=True
.
A simple solution is to call _get_signature_of
with skip_bound_arg=False
on
Line 2610 in f02fa64
That fix the test_2
but not the test_1
. I need to think about how to do better. I will be glad to your suggestions.
Р.S I would like to submit a pull request.
Linked PRs
- gh-101293: Fix inspect.signature behavior on
__call__
decorated withstaticmethod
andclassmethod
decorators. #102564 - gh-101293: Fix support of custom callables and types in inspect.Signature.from_callable() #115530
- [3.11] gh-101293: Fix support of custom callables and types in inspect.Signature.from_callable() (GH-115530) #116197
- [3.12] gh-101293: Fix support of custom callables and types in inspect.Signature.from_callable() (GH-115530) #116198