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 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().
__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: theWtype does not wrap apropertyobject.It is not hypothetical issue.
staticmethodandclassmethodhave now (bpo-43682/#87848) the__wrapped__attribute.inspect.signature()usesinspect.unwrap(), and it cannot supportstaticmethodandclassmethodeven 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:funcis a class.pickledoes it for its special methods, this is why classes are handled separately from instances. But it means thatfunctools.wraps(),staticmethodandclassmethodcannot 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: