Skip to content

Commit e45f443

Browse files
berdarioJelleZijlstra
authored andcommitted
Define functools.partial as overloaded function instead of its own class (#2878)
1 parent e7d7a44 commit e45f443

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: Callable[..., Any]
17-
args: Tuple[Any, ...]
18-
keywords: 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: Tuple[Any, ...]
32-
keywords: 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: Callable[..., _T]
45-
args: Tuple[Any, ...]
46-
keywords: 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)