This issue tracker has been migrated to GitHub, and is currently read-only.
For more information, see the GitHub FAQs in the Python's Developer Guide.

Author ofey404
Recipients larry, ofey404, ping, yselivanov
Date 2022-02-23.15:57:53
SpamBayes Score -1.0
Marked as misclassified Yes
Message-id <1645631873.56.0.42650753417.issue46761@roundup.psfhosted.org>
In-reply-to
Content
I fix the problem.

But sorry for my last message, because it totally miss the point ;)

In `inspect.signature()`, the order of handle `follow_wrapper_chains` and `functools.partial` cause the problem.

Relevant code: https://github.com/python/cpython/blob/288af845a32fd2a92e3b49738faf8f2de6a7bf7c/Lib/inspect.py#L2408

The original order is:

1. `follow_wrapper_chains` unwrap decorators.
   - It would check `__wrapped__` attribute in `unwrap()`.
   - `functools.update_wrapper()` would set `__wrapped__`.
2. Then handle `functools.partial`, construct new signature with `_signature_get_partial()`

So the original `functools.partial` object would skip (1), goto (2) and would be correctly processed.

But after calling `functools.update_wrapper()`, the `functools.partial` object has a `__wrapped__` attribute, so it directly handled by (1) and will never reach (2). That's why `inspect.signature()` return the original function's signature.

`update_wrapper.breaks.partial.signature.check.__wrapped__.py` shows the `__wrapped__` attribute.

My solution is simple: swap the order of (1) and (2).

`functools.partial` is a special type of wrapper, handle it before going down the wrapper chain is sane.

And I have written test case to ensure it's correct, hope it works.
History
Date User Action Args
2022-02-23 15:57:53ofey404setrecipients: + ofey404, ping, larry, yselivanov
2022-02-23 15:57:53ofey404setmessageid: <1645631873.56.0.42650753417.issue46761@roundup.psfhosted.org>
2022-02-23 15:57:53ofey404linkissue46761 messages
2022-02-23 15:57:53ofey404create