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