mirror of
https://github.com/davidhalter/typeshed.git
synced 2025-12-06 20:24:30 +08:00
Improve [Async]ContextDecorator type hinting (#13416)
Updated annotations allow access to `__wrapped__` on decorated callables without complaints from typecheckers.
This commit is contained in:
@@ -32,9 +32,9 @@ _T = TypeVar("_T")
|
||||
_T_co = TypeVar("_T_co", covariant=True)
|
||||
_T_io = TypeVar("_T_io", bound=IO[str] | None)
|
||||
_ExitT_co = TypeVar("_ExitT_co", covariant=True, bound=bool | None, default=bool | None)
|
||||
_F = TypeVar("_F", bound=Callable[..., Any])
|
||||
_G = TypeVar("_G", bound=Generator[Any, Any, Any] | AsyncGenerator[Any, Any], covariant=True)
|
||||
_P = ParamSpec("_P")
|
||||
_R = TypeVar("_R")
|
||||
|
||||
_SendT_contra = TypeVar("_SendT_contra", contravariant=True, default=None)
|
||||
_ReturnT_co = TypeVar("_ReturnT_co", covariant=True, default=None)
|
||||
@@ -64,9 +64,13 @@ class AbstractAsyncContextManager(ABC, Protocol[_T_co, _ExitT_co]): # type: ign
|
||||
self, exc_type: type[BaseException] | None, exc_value: BaseException | None, traceback: TracebackType | None, /
|
||||
) -> _ExitT_co: ...
|
||||
|
||||
class _WrappedCallable(Generic[_P, _R]):
|
||||
__wrapped__: Callable[_P, _R]
|
||||
def __call__(self, *args: _P.args, **kwargs: _P.kwargs) -> _R: ...
|
||||
|
||||
class ContextDecorator:
|
||||
def _recreate_cm(self) -> Self: ...
|
||||
def __call__(self, func: _F) -> _F: ...
|
||||
def __call__(self, func: Callable[_P, _R]) -> _WrappedCallable[_P, _R]: ...
|
||||
|
||||
class _GeneratorContextManagerBase(Generic[_G]):
|
||||
# Ideally this would use ParamSpec, but that requires (*args, **kwargs), which this isn't. see #6676
|
||||
@@ -93,11 +97,11 @@ class _GeneratorContextManager(
|
||||
def contextmanager(func: Callable[_P, Iterator[_T_co]]) -> Callable[_P, _GeneratorContextManager[_T_co]]: ...
|
||||
|
||||
if sys.version_info >= (3, 10):
|
||||
_AF = TypeVar("_AF", bound=Callable[..., Awaitable[Any]])
|
||||
_AR = TypeVar("_AR", bound=Awaitable[Any])
|
||||
|
||||
class AsyncContextDecorator:
|
||||
def _recreate_cm(self) -> Self: ...
|
||||
def __call__(self, func: _AF) -> _AF: ...
|
||||
def __call__(self, func: Callable[_P, _AR]) -> _WrappedCallable[_P, _AR]: ...
|
||||
|
||||
class _AsyncGeneratorContextManager(
|
||||
_GeneratorContextManagerBase[AsyncGenerator[_T_co, _SendT_contra]],
|
||||
|
||||
@@ -7,7 +7,6 @@ from re import Pattern
|
||||
from typing import Any, Literal, TypeVar
|
||||
from typing_extensions import ParamSpec
|
||||
|
||||
_C = TypeVar("_C", bound=Callable[..., Any])
|
||||
_Func = TypeVar("_Func", bound=Callable[..., Any])
|
||||
_T = TypeVar("_T")
|
||||
_P = ParamSpec("_P")
|
||||
@@ -65,8 +64,7 @@ def decorator(
|
||||
caller: Callable[..., Any], _func: Callable[..., Any] | None = ...
|
||||
) -> Callable[[Callable[..., Any]], Callable[..., Any]]: ...
|
||||
|
||||
class ContextManager(_GeneratorContextManager[_T]):
|
||||
def __call__(self, func: _C) -> _C: ...
|
||||
class ContextManager(_GeneratorContextManager[_T]): ...
|
||||
|
||||
def contextmanager(func: Callable[_P, Iterator[_T]]) -> Callable[_P, ContextManager[_T]]: ...
|
||||
def append(a: type, vancestors: list[type]) -> None: ...
|
||||
|
||||
Reference in New Issue
Block a user