-
-
Notifications
You must be signed in to change notification settings - Fork 1.8k
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
Improve type hinting for ContextDecorator
and AsyncContextDecorator
#13403
Comments
Without giving it too much tought, using a separate ParamSpec/TypeVar could work: _P = ParamSpec("_P")
_R = TypeVar("_R")
class _WrappedCallable(Generic[_P, _R]):
__wrapped__: Callable[_P, _R]
def __call__(self, *args: P.args, **kwargs: P.kwargs) -> _R: ...
class ContextDecorator:
def __call__(self, func: Callable[_P, _R]) -> _WrappedCallable[_P, _R]: ... This is basically the approach used for |
#13416 implements the above suggestion. |
Iterating on the PR showed that there's actually a deeper problem with the current nominal signature here than not being able to access Specifically, it claims that the returned value will have the same type as the input value. This is not accurate: the returned value will be a callable with the same call signature as the input value, but it will otherwise be a different type (so no extra attributes or methods that were defined on the original callable will be available). |
Working on the following PR to Discourse thread: https://discuss.python.org/t/defining-overload-preserving-signatures-for-wrapped-callables/78350 I'll post a reversion PR shortly (I would reopen the issue, but I don't have required permissions). |
This reverts commit 57d7c43. The attempted fix loses all type overload information during type inferencing, so postpone fixing the issue until we have a solution which doesn't impose such a dramatic loss in functionality. Reopens python#13403
…ython#13436) This reverts commit 57d7c43. The attempted fix loses all type overload information during type inferencing, so postpone fixing the issue until we have a solution which doesn't impose such a dramatic loss in functionality. Reopens python#13403
@ncoghlan Please reopen :) |
Related: #13512 |
I recently ran into the problem described in https://stackoverflow.com/questions/62703400/python-how-to-type-hint-a-callable-with-wrapped, where MyPy complained when I attempted to access
__wrapped__
on a function decorated with aContextDecorator
subclass.The function signature is handled correctly (as per #4399), but the fact
ContextDecorator.__call__
necessarily adds the__wrapped__
attribute to the returned wrapper is lost.The
functools
stub does have some machinery for accurately typingfunctools.wraps
itself, but there isn't anything that could be readily used to adjust theContextDecorator.__call__
signature.Ideally something like the following would be possible:
However, I'm not sure how
_WrappedCallable
could be expressed as a generic type - the corresponding protocol infunctools.pyi
accepts the call parameters and return type as separate type variables.The text was updated successfully, but these errors were encountered: