diff options
author | Serhiy Storchaka <storchaka@gmail.com> | 2024-02-26 18:07:41 (GMT) |
---|---|---|
committer | GitHub <noreply@github.com> | 2024-02-26 18:07:41 (GMT) |
commit | 68c79d21fa791d7418a858b7aa4604880e988a02 (patch) | |
tree | fc8ebb8099cc0069929a9b00e0553bf6d798ad66 /Lib/inspect.py | |
parent | b05afdd5ec325bdb4cc89bb3be177ed577bea41f (diff) | |
download | cpython-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.py | 10 |
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): |