summaryrefslogtreecommitdiffstats
path: root/Lib/inspect.py
diff options
context:
space:
mode:
authorSerhiy Storchaka <storchaka@gmail.com>2024-02-26 18:07:41 (GMT)
committerGitHub <noreply@github.com>2024-02-26 18:07:41 (GMT)
commit68c79d21fa791d7418a858b7aa4604880e988a02 (patch)
treefc8ebb8099cc0069929a9b00e0553bf6d798ad66 /Lib/inspect.py
parentb05afdd5ec325bdb4cc89bb3be177ed577bea41f (diff)
downloadcpython-68c79d21fa791d7418a858b7aa4604880e988a02.zip
cpython-68c79d21fa791d7418a858b7aa4604880e988a02.tar.gz
cpython-68c79d21fa791d7418a858b7aa4604880e988a02.tar.bz2
gh-112006: Fix inspect.unwrap() for types where __wrapped__ is a data descriptor (GH-115540)
This also fixes inspect.Signature.from_callable() for builtins classmethod() and staticmethod().
Diffstat (limited to 'Lib/inspect.py')
-rw-r--r--Lib/inspect.py10
1 files changed, 3 insertions, 7 deletions
diff --git a/Lib/inspect.py b/Lib/inspect.py
index da50403..9191d47 100644
--- a/Lib/inspect.py
+++ b/Lib/inspect.py
@@ -762,18 +762,14 @@ def unwrap(func, *, stop=None):
:exc:`ValueError` is raised if a cycle is encountered.
"""
- if stop is None:
- def _is_wrapper(f):
- return hasattr(f, '__wrapped__')
- else:
- def _is_wrapper(f):
- return hasattr(f, '__wrapped__') and not stop(f)
f = func # remember the original func for error reporting
# Memoise by id to tolerate non-hashable objects, but store objects to
# ensure they aren't destroyed, which would allow their IDs to be reused.
memo = {id(f): f}
recursion_limit = sys.getrecursionlimit()
- while _is_wrapper(func):
+ while not isinstance(func, type) and hasattr(func, '__wrapped__'):
+ if stop is not None and stop(func):
+ break
func = func.__wrapped__
id_func = id(func)
if (id_func in memo) or (len(memo) >= recursion_limit):