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().
This commit is contained in:
Serhiy Storchaka 2024-02-26 20:07:41 +02:00 committed by GitHub
parent b05afdd5ec
commit 68c79d21fa
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
3 changed files with 32 additions and 13 deletions

View file

@ -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):