New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
inspect.unwrap() does not work with types with the __wrapped__
data descriptor
#112006
Comments
serhiy-storchaka
added
type-bug
An unexpected behavior, bug, or error
stdlib
Python modules in the Lib dir
3.11
only security fixes
3.12
bugs and security fixes
3.13
bugs and security fixes
labels
Nov 12, 2023
serhiy-storchaka
added a commit
to serhiy-storchaka/cpython
that referenced
this issue
Feb 15, 2024
…data descriptor This also fixes inspect.Signature.from_callable() for builtins classmethod() and staticmethod().
AlexWaygood
changed the title
inspect.unwrap() does not work with types with the
inspect.unwrap() does not work with types with the Feb 15, 2024
__wrapper__
data descriptor__wrapped__
data descriptor
After more consideration I think that option 1 is the right one. A class should never be a wrapper with the |
serhiy-storchaka
added a commit
that referenced
this issue
Feb 26, 2024
… descriptor (GH-115540) This also fixes inspect.Signature.from_callable() for builtins classmethod() and staticmethod().
miss-islington
pushed a commit
to miss-islington/cpython
that referenced
this issue
Feb 26, 2024
…a data descriptor (pythonGH-115540) This also fixes inspect.Signature.from_callable() for builtins classmethod() and staticmethod(). (cherry picked from commit 68c79d2) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
miss-islington
pushed a commit
to miss-islington/cpython
that referenced
this issue
Feb 26, 2024
…a data descriptor (pythonGH-115540) This also fixes inspect.Signature.from_callable() for builtins classmethod() and staticmethod(). (cherry picked from commit 68c79d2) Co-authored-by: Serhiy Storchaka <storchaka@gmail.com>
serhiy-storchaka
added a commit
that referenced
this issue
Feb 27, 2024
serhiy-storchaka
added a commit
that referenced
this issue
Feb 27, 2024
woodruffw
pushed a commit
to woodruffw-forks/cpython
that referenced
this issue
Mar 4, 2024
…a data descriptor (pythonGH-115540) This also fixes inspect.Signature.from_callable() for builtins classmethod() and staticmethod().
adorilson
pushed a commit
to adorilson/cpython
that referenced
this issue
Mar 25, 2024
…a data descriptor (pythonGH-115540) This also fixes inspect.Signature.from_callable() for builtins classmethod() and staticmethod().
diegorusso
pushed a commit
to diegorusso/cpython
that referenced
this issue
Apr 17, 2024
…a data descriptor (pythonGH-115540) This also fixes inspect.Signature.from_callable() for builtins classmethod() and staticmethod().
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Bug report
inspect.unwrap()
follows the chain by links__wrapped__
and returns the last item in a chain or the original object if it does not have a__wrapped__
attribute (there is also additional stop predicate and protection against loops, but it is unrelated). It works well in most cases, except with a type that has the__wrapped__
data descriptor.For example the following code
prints
The former output is correct,
W(chr)
wrapschr
. But the latter is wrong: theW
type does not wrap aproperty
object.It is not hypothetical issue.
staticmethod
andclassmethod
have now (bpo-43682/#87848) the__wrapped__
attribute.inspect.signature()
usesinspect.unwrap()
, and it cannot supportstaticmethod
andclassmethod
even if they get correct__text_signature__
.inspect.getsourcelines()
also usesinspect.unwrap()
indirectly and can fail with Python classes with the__wrapped__
attribute.inspect.unwrap()
should stop before such attribute. But how to detect such case? There are several ways:func
is a class.pickle
does it for its special methods, this is why classes are handled separately from instances. But it means thatfunctools.wraps()
,staticmethod
andclassmethod
cannot be used to decorate classes. Although if they are currently used, the result can be weird, because instances will have the same__wrapped__
attribute as a class. I do not know how often wrapped classes are used in the real code, but there is a test for this. It may be the right way at the end, although it can break some questionable code.func.__wrapped__
is a data descriptor. I afraid that it will affect multidecorated properties.func.__wrapped__
is not callable. Do not know what can be consequences.Maybe there are other ways?
Linked PRs
The text was updated successfully, but these errors were encountered: