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