From e45f443d8530f0dd9f9022720a994f222da6f0fd Mon Sep 17 00:00:00 2001 From: berdario Date: Mon, 6 May 2019 18:05:02 +0200 Subject: [PATCH] Define functools.partial as overloaded function instead of its own class (#2878) --- stdlib/2/_functools.pyi | 79 +++++++++++++++++++++++++++++++++++++---- stdlib/2/functools.pyi | 79 +++++++++++++++++++++++++++++++++++++---- stdlib/3/functools.pyi | 79 +++++++++++++++++++++++++++++++++++++---- 3 files changed, 219 insertions(+), 18 deletions(-) diff --git a/stdlib/2/_functools.pyi b/stdlib/2/_functools.pyi index 876974e45..064188505 100644 --- a/stdlib/2/_functools.pyi +++ b/stdlib/2/_functools.pyi @@ -3,6 +3,10 @@ from typing import Any, Callable, Dict, Iterable, Optional, TypeVar, Tuple, overload _T = TypeVar("_T") +_T2 = TypeVar("_T2") +_T3 = TypeVar("_T3") +_T4 = TypeVar("_T4") +_T5 = TypeVar("_T5") _S = TypeVar("_S") @overload @@ -12,9 +16,72 @@ def reduce(function: Callable[[_T, _T], _T], def reduce(function: Callable[[_T, _S], _T], sequence: Iterable[_S], initial: _T) -> _T: ... -class partial(object): - func: Callable[..., Any] - args: Tuple[Any, ...] - keywords: Dict[str, Any] - def __init__(self, func: Callable[..., Any], *args: Any, **kwargs: Any) -> None: ... - def __call__(self, *args: Any, **kwargs: Any) -> Any: ... +@overload +def partial(__func: Callable[[_T], _S], __arg: _T) -> Callable[[], _S]: ... +@overload +def partial(__func: Callable[[_T, _T2], _S], __arg: _T) -> Callable[[_T2], _S]: ... +@overload +def partial(__func: Callable[[_T, _T2, _T3], _S], __arg: _T) -> Callable[[_T2, _T3], _S]: ... +@overload +def partial(__func: Callable[[_T, _T2, _T3, _T4], _S], __arg: _T) -> Callable[[_T2, _T3, _T4], _S]: ... +@overload +def partial(__func: Callable[[_T, _T2, _T3, _T4, _T5], _S], __arg: _T) -> Callable[[_T2, _T3, _T4, _T5], _S]: ... + +@overload +def partial(__func: Callable[[_T, _T2], _S], + __arg1: _T, + __arg2: _T2) -> Callable[[], _S]: ... +@overload +def partial(__func: Callable[[_T, _T2, _T3], _S], + __arg1: _T, + __arg2: _T2) -> Callable[[_T3], _S]: ... +@overload +def partial(__func: Callable[[_T, _T2, _T3, _T4], _S], + __arg1: _T, + __arg2: _T2) -> Callable[[_T3, _T4], _S]: ... +@overload +def partial(__func: Callable[[_T, _T2, _T3, _T4, _T5], _S], + __arg1: _T, + __arg2: _T2) -> Callable[[_T3, _T4, _T5], _S]: ... + +@overload +def partial(__func: Callable[[_T, _T2, _T3], _S], + __arg1: _T, + __arg2: _T2, + __arg3: _T3) -> Callable[[], _S]: ... +@overload +def partial(__func: Callable[[_T, _T2, _T3, _T4], _S], + __arg1: _T, + __arg2: _T2, + __arg3: _T3) -> Callable[[_T4], _S]: ... +@overload +def partial(__func: Callable[[_T, _T2, _T3, _T4, _T5], _S], + __arg1: _T, + __arg2: _T2, + __arg3: _T3) -> Callable[[_T4, _T5], _S]: ... + +@overload +def partial(__func: Callable[[_T, _T2, _T3, _T4], _S], + __arg1: _T, + __arg2: _T2, + __arg3: _T3, + __arg4: _T4) -> Callable[[], _S]: ... +@overload +def partial(__func: Callable[[_T, _T2, _T3, _T4, _T5], _S], + __arg1: _T, + __arg2: _T2, + __arg3: _T3, + __arg4: _T4) -> Callable[[_T5], _S]: ... + +@overload +def partial(__func: Callable[[_T, _T2, _T3, _T4, _T5], _S], + __arg1: _T, + __arg2: _T2, + __arg3: _T3, + __arg4: _T4, + __arg5: _T5) -> Callable[[], _S]: ... + +@overload +def partial(__func: Callable[..., _S], + *args: Any, + **kwargs: Any) -> Callable[..., _S]: ... diff --git a/stdlib/2/functools.pyi b/stdlib/2/functools.pyi index 5d65d23c9..c12af8fe7 100644 --- a/stdlib/2/functools.pyi +++ b/stdlib/2/functools.pyi @@ -9,6 +9,10 @@ from collections import namedtuple _AnyCallable = Callable[..., Any] _T = TypeVar("_T") +_T2 = TypeVar("_T2") +_T3 = TypeVar("_T3") +_T4 = TypeVar("_T4") +_T5 = TypeVar("_T5") _S = TypeVar("_S") @overload def reduce(function: Callable[[_T, _T], _T], @@ -26,9 +30,72 @@ def wraps(wrapped: _AnyCallable, assigned: Sequence[str] = ..., updated: Sequenc def total_ordering(cls: type) -> type: ... def cmp_to_key(mycmp: Callable[[_T, _T], int]) -> Callable[[_T], Any]: ... -class partial(Generic[_T]): - func = ... # Callable[..., _T] - args: Tuple[Any, ...] - keywords: Dict[str, Any] - def __init__(self, func: Callable[..., _T], *args: Any, **kwargs: Any) -> None: ... - def __call__(self, *args: Any, **kwargs: Any) -> _T: ... +@overload +def partial(__func: Callable[[_T], _S], __arg: _T) -> Callable[[], _S]: ... +@overload +def partial(__func: Callable[[_T, _T2], _S], __arg: _T) -> Callable[[_T2], _S]: ... +@overload +def partial(__func: Callable[[_T, _T2, _T3], _S], __arg: _T) -> Callable[[_T2, _T3], _S]: ... +@overload +def partial(__func: Callable[[_T, _T2, _T3, _T4], _S], __arg: _T) -> Callable[[_T2, _T3, _T4], _S]: ... +@overload +def partial(__func: Callable[[_T, _T2, _T3, _T4, _T5], _S], __arg: _T) -> Callable[[_T2, _T3, _T4, _T5], _S]: ... + +@overload +def partial(__func: Callable[[_T, _T2], _S], + __arg1: _T, + __arg2: _T2) -> Callable[[], _S]: ... +@overload +def partial(__func: Callable[[_T, _T2, _T3], _S], + __arg1: _T, + __arg2: _T2) -> Callable[[_T3], _S]: ... +@overload +def partial(__func: Callable[[_T, _T2, _T3, _T4], _S], + __arg1: _T, + __arg2: _T2) -> Callable[[_T3, _T4], _S]: ... +@overload +def partial(__func: Callable[[_T, _T2, _T3, _T4, _T5], _S], + __arg1: _T, + __arg2: _T2) -> Callable[[_T3, _T4, _T5], _S]: ... + +@overload +def partial(__func: Callable[[_T, _T2, _T3], _S], + __arg1: _T, + __arg2: _T2, + __arg3: _T3) -> Callable[[], _S]: ... +@overload +def partial(__func: Callable[[_T, _T2, _T3, _T4], _S], + __arg1: _T, + __arg2: _T2, + __arg3: _T3) -> Callable[[_T4], _S]: ... +@overload +def partial(__func: Callable[[_T, _T2, _T3, _T4, _T5], _S], + __arg1: _T, + __arg2: _T2, + __arg3: _T3) -> Callable[[_T4, _T5], _S]: ... + +@overload +def partial(__func: Callable[[_T, _T2, _T3, _T4], _S], + __arg1: _T, + __arg2: _T2, + __arg3: _T3, + __arg4: _T4) -> Callable[[], _S]: ... +@overload +def partial(__func: Callable[[_T, _T2, _T3, _T4, _T5], _S], + __arg1: _T, + __arg2: _T2, + __arg3: _T3, + __arg4: _T4) -> Callable[[_T5], _S]: ... + +@overload +def partial(__func: Callable[[_T, _T2, _T3, _T4, _T5], _S], + __arg1: _T, + __arg2: _T2, + __arg3: _T3, + __arg4: _T4, + __arg5: _T5) -> Callable[[], _S]: ... + +@overload +def partial(__func: Callable[..., _S], + *args: Any, + **kwargs: Any) -> Callable[..., _S]: ... diff --git a/stdlib/3/functools.pyi b/stdlib/3/functools.pyi index ce89e7173..409e84b3c 100644 --- a/stdlib/3/functools.pyi +++ b/stdlib/3/functools.pyi @@ -4,6 +4,10 @@ from typing import Any, Callable, Generic, Dict, Iterable, Mapping, Optional, Se _AnyCallable = Callable[..., Any] _T = TypeVar("_T") +_T2 = TypeVar("_T2") +_T3 = TypeVar("_T3") +_T4 = TypeVar("_T4") +_T5 = TypeVar("_T5") _S = TypeVar("_S") @overload def reduce(function: Callable[[_T, _S], _T], @@ -40,12 +44,75 @@ def wraps(wrapped: _AnyCallable, assigned: Sequence[str] = ..., updated: Sequenc def total_ordering(cls: type) -> type: ... def cmp_to_key(mycmp: Callable[[_T, _T], int]) -> Callable[[_T], Any]: ... -class partial(Generic[_T]): - func: Callable[..., _T] - args: Tuple[Any, ...] - keywords: Dict[str, Any] - def __init__(self, func: Callable[..., _T], *args: Any, **kwargs: Any) -> None: ... - def __call__(self, *args: Any, **kwargs: Any) -> _T: ... +@overload +def partial(__func: Callable[[_T], _S], __arg: _T) -> Callable[[], _S]: ... +@overload +def partial(__func: Callable[[_T, _T2], _S], __arg: _T) -> Callable[[_T2], _S]: ... +@overload +def partial(__func: Callable[[_T, _T2, _T3], _S], __arg: _T) -> Callable[[_T2, _T3], _S]: ... +@overload +def partial(__func: Callable[[_T, _T2, _T3, _T4], _S], __arg: _T) -> Callable[[_T2, _T3, _T4], _S]: ... +@overload +def partial(__func: Callable[[_T, _T2, _T3, _T4, _T5], _S], __arg: _T) -> Callable[[_T2, _T3, _T4, _T5], _S]: ... + +@overload +def partial(__func: Callable[[_T, _T2], _S], + __arg1: _T, + __arg2: _T2) -> Callable[[], _S]: ... +@overload +def partial(__func: Callable[[_T, _T2, _T3], _S], + __arg1: _T, + __arg2: _T2) -> Callable[[_T3], _S]: ... +@overload +def partial(__func: Callable[[_T, _T2, _T3, _T4], _S], + __arg1: _T, + __arg2: _T2) -> Callable[[_T3, _T4], _S]: ... +@overload +def partial(__func: Callable[[_T, _T2, _T3, _T4, _T5], _S], + __arg1: _T, + __arg2: _T2) -> Callable[[_T3, _T4, _T5], _S]: ... + +@overload +def partial(__func: Callable[[_T, _T2, _T3], _S], + __arg1: _T, + __arg2: _T2, + __arg3: _T3) -> Callable[[], _S]: ... +@overload +def partial(__func: Callable[[_T, _T2, _T3, _T4], _S], + __arg1: _T, + __arg2: _T2, + __arg3: _T3) -> Callable[[_T4], _S]: ... +@overload +def partial(__func: Callable[[_T, _T2, _T3, _T4, _T5], _S], + __arg1: _T, + __arg2: _T2, + __arg3: _T3) -> Callable[[_T4, _T5], _S]: ... + +@overload +def partial(__func: Callable[[_T, _T2, _T3, _T4], _S], + __arg1: _T, + __arg2: _T2, + __arg3: _T3, + __arg4: _T4) -> Callable[[], _S]: ... +@overload +def partial(__func: Callable[[_T, _T2, _T3, _T4, _T5], _S], + __arg1: _T, + __arg2: _T2, + __arg3: _T3, + __arg4: _T4) -> Callable[[_T5], _S]: ... + +@overload +def partial(__func: Callable[[_T, _T2, _T3, _T4, _T5], _S], + __arg1: _T, + __arg2: _T2, + __arg3: _T3, + __arg4: _T4, + __arg5: _T5) -> Callable[[], _S]: ... + +@overload +def partial(__func: Callable[..., _S], + *args: Any, + **kwargs: Any) -> Callable[..., _S]: ... # With protocols, this could change into a generic protocol that defines __get__ and returns _T _Descriptor = Any