Skip to content

inspect.signature returns incorrect result on a @staticmethod and a @classmethod #101293

Closed
@heckad

Description

@heckad

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

sig = _get_signature_of(call)

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

Metadata

Metadata

Assignees

No one assigned

    Labels

    stdlibPython modules in the Lib dirtype-bugAn unexpected behavior, bug, or error

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions