Skip to content

Commit 4ff51af

Browse files
committed
Define functools.partial as overloaded function instead of its own class
1 parent afe6656 commit 4ff51af

File tree

3 files changed

+219
-18
lines changed

3 files changed

+219
-18
lines changed

stdlib/2/_functools.pyi

Lines changed: 73 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -3,6 +3,10 @@
33
from typing import Any, Callable, Dict, Iterable, Optional, TypeVar, Tuple, overload
44

55
_T = TypeVar("_T")
6+
_T2 = TypeVar("_T2")
7+
_T3 = TypeVar("_T3")
8+
_T4 = TypeVar("_T4")
9+
_T5 = TypeVar("_T5")
610
_S = TypeVar("_S")
711

812
@overload
@@ -12,9 +16,72 @@ def reduce(function: Callable[[_T, _T], _T],
1216
def reduce(function: Callable[[_T, _S], _T],
1317
sequence: Iterable[_S], initial: _T) -> _T: ...
1418

15-
class partial(object):
16-
func = ... # type: Callable[..., Any]
17-
args = ... # type: Tuple[Any, ...]
18-
keywords = ... # type: Dict[str, Any]
19-
def __init__(self, func: Callable[..., Any], *args: Any, **kwargs: Any) -> None: ...
20-
def __call__(self, *args: Any, **kwargs: Any) -> Any: ...
19+
@overload
20+
def partial(func: Callable[[_T], _S], arg: _T) -> Callable[[], _S]: ...
21+
@overload
22+
def partial(func: Callable[[_T, _T2], _S], arg: _T) -> Callable[[_T2], _S]: ...
23+
@overload
24+
def partial(func: Callable[[_T, _T2, _T3], _S], arg: _T) -> Callable[[_T2, _T3], _S]: ...
25+
@overload
26+
def partial(func: Callable[[_T, _T2, _T3, _T4], _S], arg: _T) -> Callable[[_T2, _T3, _T4], _S]: ...
27+
@overload
28+
def partial(func: Callable[[_T, _T2, _T3, _T4, _T5], _S], arg: _T) -> Callable[[_T2, _T3, _T4, _T5], _S]: ...
29+
30+
@overload
31+
def partial(func: Callable[[_T, _T2], _S],
32+
arg1: _T,
33+
arg2: _T2) -> Callable[[], _S]: ...
34+
@overload
35+
def partial(func: Callable[[_T, _T2, _T3], _S],
36+
arg1: _T,
37+
arg2: _T2) -> Callable[[_T3], _S]: ...
38+
@overload
39+
def partial(func: Callable[[_T, _T2, _T3, _T4], _S],
40+
arg1: _T,
41+
arg2: _T2) -> Callable[[_T3, _T4], _S]: ...
42+
@overload
43+
def partial(func: Callable[[_T, _T2, _T3, _T4, _T5], _S],
44+
arg1: _T,
45+
arg2: _T2) -> Callable[[_T3, _T4, _T5], _S]: ...
46+
47+
@overload
48+
def partial(func: Callable[[_T, _T2, _T3], _S],
49+
arg1: _T,
50+
arg2: _T2,
51+
arg3: _T3) -> Callable[[], _S]: ...
52+
@overload
53+
def partial(func: Callable[[_T, _T2, _T3, _T4], _S],
54+
arg1: _T,
55+
arg2: _T2,
56+
arg3: _T3) -> Callable[[_T4], _S]: ...
57+
@overload
58+
def partial(func: Callable[[_T, _T2, _T3, _T4, _T5], _S],
59+
arg1: _T,
60+
arg2: _T2,
61+
arg3: _T3) -> Callable[[_T4, _T5], _S]: ...
62+
63+
@overload
64+
def partial(func: Callable[[_T, _T2, _T3, _T4], _S],
65+
arg1: _T,
66+
arg2: _T2,
67+
arg3: _T3,
68+
arg4: _T4) -> Callable[[], _S]: ...
69+
@overload
70+
def partial(func: Callable[[_T, _T2, _T3, _T4, _T5], _S],
71+
arg1: _T,
72+
arg2: _T2,
73+
arg3: _T3,
74+
arg4: _T4) -> Callable[[_T5], _S]: ...
75+
76+
@overload
77+
def partial(func: Callable[[_T, _T2, _T3, _T4, _T5], _S],
78+
arg1: _T,
79+
arg2: _T2,
80+
arg3: _T3,
81+
arg4: _T4,
82+
arg5: _T5) -> Callable[[], _S]: ...
83+
84+
@overload
85+
def partial(func: Callable[..., _S],
86+
*args: Any,
87+
**kwargs: Any) -> Callable[..., _S]: ...

stdlib/2/functools.pyi

Lines changed: 73 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ from collections import namedtuple
99
_AnyCallable = Callable[..., Any]
1010

1111
_T = TypeVar("_T")
12+
_T2 = TypeVar("_T2")
13+
_T3 = TypeVar("_T3")
14+
_T4 = TypeVar("_T4")
15+
_T5 = TypeVar("_T5")
1216
_S = TypeVar("_S")
1317
@overload
1418
def reduce(function: Callable[[_T, _T], _T],
@@ -26,9 +30,72 @@ def wraps(wrapped: _AnyCallable, assigned: Sequence[str] = ..., updated: Sequenc
2630
def total_ordering(cls: type) -> type: ...
2731
def cmp_to_key(mycmp: Callable[[_T, _T], int]) -> Callable[[_T], Any]: ...
2832

29-
class partial(Generic[_T]):
30-
func = ... # Callable[..., _T]
31-
args = ... # type: Tuple[Any, ...]
32-
keywords = ... # type: Dict[str, Any]
33-
def __init__(self, func: Callable[..., _T], *args: Any, **kwargs: Any) -> None: ...
34-
def __call__(self, *args: Any, **kwargs: Any) -> _T: ...
33+
@overload
34+
def partial(func: Callable[[_T], _S], arg: _T) -> Callable[[], _S]: ...
35+
@overload
36+
def partial(func: Callable[[_T, _T2], _S], arg: _T) -> Callable[[_T2], _S]: ...
37+
@overload
38+
def partial(func: Callable[[_T, _T2, _T3], _S], arg: _T) -> Callable[[_T2, _T3], _S]: ...
39+
@overload
40+
def partial(func: Callable[[_T, _T2, _T3, _T4], _S], arg: _T) -> Callable[[_T2, _T3, _T4], _S]: ...
41+
@overload
42+
def partial(func: Callable[[_T, _T2, _T3, _T4, _T5], _S], arg: _T) -> Callable[[_T2, _T3, _T4, _T5], _S]: ...
43+
44+
@overload
45+
def partial(func: Callable[[_T, _T2], _S],
46+
arg1: _T,
47+
arg2: _T2) -> Callable[[], _S]: ...
48+
@overload
49+
def partial(func: Callable[[_T, _T2, _T3], _S],
50+
arg1: _T,
51+
arg2: _T2) -> Callable[[_T3], _S]: ...
52+
@overload
53+
def partial(func: Callable[[_T, _T2, _T3, _T4], _S],
54+
arg1: _T,
55+
arg2: _T2) -> Callable[[_T3, _T4], _S]: ...
56+
@overload
57+
def partial(func: Callable[[_T, _T2, _T3, _T4, _T5], _S],
58+
arg1: _T,
59+
arg2: _T2) -> Callable[[_T3, _T4, _T5], _S]: ...
60+
61+
@overload
62+
def partial(func: Callable[[_T, _T2, _T3], _S],
63+
arg1: _T,
64+
arg2: _T2,
65+
arg3: _T3) -> Callable[[], _S]: ...
66+
@overload
67+
def partial(func: Callable[[_T, _T2, _T3, _T4], _S],
68+
arg1: _T,
69+
arg2: _T2,
70+
arg3: _T3) -> Callable[[_T4], _S]: ...
71+
@overload
72+
def partial(func: Callable[[_T, _T2, _T3, _T4, _T5], _S],
73+
arg1: _T,
74+
arg2: _T2,
75+
arg3: _T3) -> Callable[[_T4, _T5], _S]: ...
76+
77+
@overload
78+
def partial(func: Callable[[_T, _T2, _T3, _T4], _S],
79+
arg1: _T,
80+
arg2: _T2,
81+
arg3: _T3,
82+
arg4: _T4) -> Callable[[], _S]: ...
83+
@overload
84+
def partial(func: Callable[[_T, _T2, _T3, _T4, _T5], _S],
85+
arg1: _T,
86+
arg2: _T2,
87+
arg3: _T3,
88+
arg4: _T4) -> Callable[[_T5], _S]: ...
89+
90+
@overload
91+
def partial(func: Callable[[_T, _T2, _T3, _T4, _T5], _S],
92+
arg1: _T,
93+
arg2: _T2,
94+
arg3: _T3,
95+
arg4: _T4,
96+
arg5: _T5) -> Callable[[], _S]: ...
97+
98+
@overload
99+
def partial(func: Callable[..., _S],
100+
*args: Any,
101+
**kwargs: Any) -> Callable[..., _S]: ...

stdlib/3/functools.pyi

Lines changed: 73 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,10 @@ from typing import Any, Callable, Generic, Dict, Iterable, Mapping, Optional, Se
44
_AnyCallable = Callable[..., Any]
55

66
_T = TypeVar("_T")
7+
_T2 = TypeVar("_T2")
8+
_T3 = TypeVar("_T3")
9+
_T4 = TypeVar("_T4")
10+
_T5 = TypeVar("_T5")
711
_S = TypeVar("_S")
812
@overload
913
def reduce(function: Callable[[_T, _S], _T],
@@ -40,12 +44,75 @@ def wraps(wrapped: _AnyCallable, assigned: Sequence[str] = ..., updated: Sequenc
4044
def total_ordering(cls: type) -> type: ...
4145
def cmp_to_key(mycmp: Callable[[_T, _T], int]) -> Callable[[_T], Any]: ...
4246

43-
class partial(Generic[_T]):
44-
func = ... # type: Callable[..., _T]
45-
args = ... # type: Tuple[Any, ...]
46-
keywords = ... # type: Dict[str, Any]
47-
def __init__(self, func: Callable[..., _T], *args: Any, **kwargs: Any) -> None: ...
48-
def __call__(self, *args: Any, **kwargs: Any) -> _T: ...
47+
@overload
48+
def partial(func: Callable[[_T], _S], arg: _T) -> Callable[[], _S]: ...
49+
@overload
50+
def partial(func: Callable[[_T, _T2], _S], arg: _T) -> Callable[[_T2], _S]: ...
51+
@overload
52+
def partial(func: Callable[[_T, _T2, _T3], _S], arg: _T) -> Callable[[_T2, _T3], _S]: ...
53+
@overload
54+
def partial(func: Callable[[_T, _T2, _T3, _T4], _S], arg: _T) -> Callable[[_T2, _T3, _T4], _S]: ...
55+
@overload
56+
def partial(func: Callable[[_T, _T2, _T3, _T4, _T5], _S], arg: _T) -> Callable[[_T2, _T3, _T4, _T5], _S]: ...
57+
58+
@overload
59+
def partial(func: Callable[[_T, _T2], _S],
60+
arg1: _T,
61+
arg2: _T2) -> Callable[[], _S]: ...
62+
@overload
63+
def partial(func: Callable[[_T, _T2, _T3], _S],
64+
arg1: _T,
65+
arg2: _T2) -> Callable[[_T3], _S]: ...
66+
@overload
67+
def partial(func: Callable[[_T, _T2, _T3, _T4], _S],
68+
arg1: _T,
69+
arg2: _T2) -> Callable[[_T3, _T4], _S]: ...
70+
@overload
71+
def partial(func: Callable[[_T, _T2, _T3, _T4, _T5], _S],
72+
arg1: _T,
73+
arg2: _T2) -> Callable[[_T3, _T4, _T5], _S]: ...
74+
75+
@overload
76+
def partial(func: Callable[[_T, _T2, _T3], _S],
77+
arg1: _T,
78+
arg2: _T2,
79+
arg3: _T3) -> Callable[[], _S]: ...
80+
@overload
81+
def partial(func: Callable[[_T, _T2, _T3, _T4], _S],
82+
arg1: _T,
83+
arg2: _T2,
84+
arg3: _T3) -> Callable[[_T4], _S]: ...
85+
@overload
86+
def partial(func: Callable[[_T, _T2, _T3, _T4, _T5], _S],
87+
arg1: _T,
88+
arg2: _T2,
89+
arg3: _T3) -> Callable[[_T4, _T5], _S]: ...
90+
91+
@overload
92+
def partial(func: Callable[[_T, _T2, _T3, _T4], _S],
93+
arg1: _T,
94+
arg2: _T2,
95+
arg3: _T3,
96+
arg4: _T4) -> Callable[[], _S]: ...
97+
@overload
98+
def partial(func: Callable[[_T, _T2, _T3, _T4, _T5], _S],
99+
arg1: _T,
100+
arg2: _T2,
101+
arg3: _T3,
102+
arg4: _T4) -> Callable[[_T5], _S]: ...
103+
104+
@overload
105+
def partial(func: Callable[[_T, _T2, _T3, _T4, _T5], _S],
106+
arg1: _T,
107+
arg2: _T2,
108+
arg3: _T3,
109+
arg4: _T4,
110+
arg5: _T5) -> Callable[[], _S]: ...
111+
112+
@overload
113+
def partial(func: Callable[..., _S],
114+
*args: Any,
115+
**kwargs: Any) -> Callable[..., _S]: ...
49116

50117
# With protocols, this could change into a generic protocol that defines __get__ and returns _T
51118
_Descriptor = Any

0 commit comments

Comments
 (0)