Skip to content

Commit

Permalink
gh-74044: inspect.signature for wrappers around decorated bound metho…
Browse files Browse the repository at this point in the history
…ds (GH-736)

(cherry picked from commit dbf2faf)

Co-authored-by: Anton Ryzhov <anton@ryzhov.me>
  • Loading branch information
miss-islington and anton-ryzhov committed Nov 10, 2022
1 parent 921f235 commit 1de088c
Show file tree
Hide file tree
Showing 3 changed files with 12 additions and 3 deletions.
5 changes: 4 additions & 1 deletion Lib/inspect.py
Original file line number Diff line number Diff line change
Expand Up @@ -2457,7 +2457,10 @@ def _signature_from_callable(obj, *,

# Was this function wrapped by a decorator?
if follow_wrapper_chains:
obj = unwrap(obj, stop=(lambda f: hasattr(f, "__signature__")))
# Unwrap until we find an explicit signature or a MethodType (which will be
# handled explicitly below).
obj = unwrap(obj, stop=(lambda f: hasattr(f, "__signature__")
or isinstance(f, types.MethodType)))
if isinstance(obj, types.MethodType):
# If the unwrapped object is a *method*, we might want to
# skip its first parameter (self).
Expand Down
9 changes: 7 additions & 2 deletions Lib/test/test_inspect.py
Original file line number Diff line number Diff line change
Expand Up @@ -2960,8 +2960,6 @@ def foo(a): pass
self.assertEqual(str(inspect.signature(foo)), '(a)')

def test_signature_on_decorated(self):
import functools

def decorator(func):
@functools.wraps(func)
def wrapper(*args, **kwargs) -> int:
Expand All @@ -2973,6 +2971,8 @@ class Foo:
def bar(self, a, b):
pass

bar = decorator(Foo().bar)

self.assertEqual(self.signature(Foo.bar),
((('self', ..., ..., "positional_or_keyword"),
('a', ..., ..., "positional_or_keyword"),
Expand All @@ -2991,6 +2991,11 @@ def bar(self, a, b):
# from "func" to "wrapper", hence no
# return_annotation

self.assertEqual(self.signature(bar),
((('a', ..., ..., "positional_or_keyword"),
('b', ..., ..., "positional_or_keyword")),
...))

# Test that we handle method wrappers correctly
def decorator(func):
@functools.wraps(func)
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1 @@
Fixed bug where :func:`inspect.signature` reported incorrect arguments for decorated methods.

0 comments on commit 1de088c

Please sign in to comment.