Skip to content

Commit e86c61d

Browse files
eltoderAlexWaygood
andauthored
More precise overloads for get/pop methods (#10501)
Fixes #10293 Co-authored-by: AlexWaygood <[email protected]>
1 parent 21e8f7b commit e86c61d

File tree

7 files changed

+38
-14
lines changed

7 files changed

+38
-14
lines changed

stdlib/builtins.pyi

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1096,14 +1096,18 @@ class dict(MutableMapping[_KT, _VT], Generic[_KT, _VT]):
10961096
@overload
10971097
def fromkeys(cls, __iterable: Iterable[_T], __value: _S) -> dict[_T, _S]: ...
10981098
# Positional-only in dict, but not in MutableMapping
1099-
@overload
1099+
@overload # type: ignore[override]
11001100
def get(self, __key: _KT) -> _VT | None: ...
11011101
@overload
1102-
def get(self, __key: _KT, __default: _VT | _T) -> _VT | _T: ...
1102+
def get(self, __key: _KT, __default: _VT) -> _VT: ...
1103+
@overload
1104+
def get(self, __key: _KT, __default: _T) -> _VT | _T: ...
11031105
@overload
11041106
def pop(self, __key: _KT) -> _VT: ...
11051107
@overload
1106-
def pop(self, __key: _KT, __default: _VT | _T) -> _VT | _T: ...
1108+
def pop(self, __key: _KT, __default: _VT) -> _VT: ...
1109+
@overload
1110+
def pop(self, __key: _KT, __default: _T) -> _VT | _T: ...
11071111
def __len__(self) -> int: ...
11081112
def __getitem__(self, __key: _KT) -> _VT: ...
11091113
def __setitem__(self, __key: _KT, __value: _VT) -> None: ...

stdlib/collections/__init__.pyi

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -432,7 +432,9 @@ class ChainMap(MutableMapping[_KT, _VT], Generic[_KT, _VT]):
432432
@overload
433433
def pop(self, key: _KT) -> _VT: ...
434434
@overload
435-
def pop(self, key: _KT, default: _VT | _T) -> _VT | _T: ...
435+
def pop(self, key: _KT, default: _VT) -> _VT: ...
436+
@overload
437+
def pop(self, key: _KT, default: _T) -> _VT | _T: ...
436438
def copy(self) -> Self: ...
437439
__copy__ = copy
438440
# All arguments to `fromkeys` are passed to `dict.fromkeys` at runtime, so the signature should be kept in line with `dict.fromkeys`.

stdlib/contextvars.pyi

Lines changed: 9 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -25,10 +25,14 @@ class ContextVar(Generic[_T]):
2525
def get(self) -> _T: ...
2626
if sys.version_info >= (3, 8):
2727
@overload
28-
def get(self, default: _D | _T) -> _D | _T: ...
28+
def get(self, default: _T) -> _T: ...
29+
@overload
30+
def get(self, default: _D) -> _D | _T: ...
2931
else:
3032
@overload
31-
def get(self, __default: _D | _T) -> _D | _T: ...
33+
def get(self, __default: _T) -> _T: ...
34+
@overload
35+
def get(self, __default: _D) -> _D | _T: ...
3236

3337
def set(self, __value: _T) -> Token[_T]: ...
3438
def reset(self, __token: Token[_T]) -> None: ...
@@ -53,7 +57,9 @@ def copy_context() -> Context: ...
5357
class Context(Mapping[ContextVar[Any], Any]):
5458
def __init__(self) -> None: ...
5559
@overload
56-
def get(self, __key: ContextVar[_T]) -> _T | None: ...
60+
def get(self, __key: ContextVar[_T], __default: None = None) -> _T | None: ... # type: ignore[misc] # overlapping overloads
61+
@overload
62+
def get(self, __key: ContextVar[_T], __default: _T) -> _T: ...
5763
@overload
5864
def get(self, __key: ContextVar[_T], __default: _D) -> _T | _D: ...
5965
def run(self, callable: Callable[_P, _T], *args: _P.args, **kwargs: _P.kwargs) -> _T: ...

stdlib/multiprocessing/managers.pyi

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -73,14 +73,18 @@ class DictProxy(BaseProxy, MutableMapping[_KT, _VT]):
7373
def __delitem__(self, __key: _KT) -> None: ...
7474
def __iter__(self) -> Iterator[_KT]: ...
7575
def copy(self) -> dict[_KT, _VT]: ...
76-
@overload
76+
@overload # type: ignore[override]
7777
def get(self, __key: _KT) -> _VT | None: ...
7878
@overload
79-
def get(self, __key: _KT, __default: _VT | _T) -> _VT | _T: ...
79+
def get(self, __key: _KT, __default: _VT) -> _VT: ...
80+
@overload
81+
def get(self, __key: _KT, __default: _T) -> _VT | _T: ...
8082
@overload
8183
def pop(self, __key: _KT) -> _VT: ...
8284
@overload
83-
def pop(self, __key: _KT, __default: _VT | _T) -> _VT | _T: ...
85+
def pop(self, __key: _KT, __default: _VT) -> _VT: ...
86+
@overload
87+
def pop(self, __key: _KT, __default: _T) -> _VT | _T: ...
8488
def keys(self) -> list[_KT]: ... # type: ignore[override]
8589
def items(self) -> list[tuple[_KT, _VT]]: ... # type: ignore[override]
8690
def values(self) -> list[_VT]: ... # type: ignore[override]

stdlib/shelve.pyi

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -15,8 +15,10 @@ class Shelf(MutableMapping[str, _VT]):
1515
) -> None: ...
1616
def __iter__(self) -> Iterator[str]: ...
1717
def __len__(self) -> int: ...
18+
@overload # type: ignore[override]
19+
def get(self, key: str, default: None = None) -> _VT | None: ... # type: ignore[misc] # overlapping overloads
1820
@overload
19-
def get(self, key: str) -> _VT | None: ...
21+
def get(self, key: str, default: _VT) -> _VT: ...
2022
@overload
2123
def get(self, key: str, default: _T) -> _VT | _T: ...
2224
def __getitem__(self, key: str) -> _VT: ...

stdlib/typing.pyi

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -650,7 +650,9 @@ class MutableMapping(Mapping[_KT, _VT], Generic[_KT, _VT]):
650650
@overload
651651
def pop(self, __key: _KT) -> _VT: ...
652652
@overload
653-
def pop(self, __key: _KT, default: _VT | _T) -> _VT | _T: ...
653+
def pop(self, __key: _KT, default: _VT) -> _VT: ...
654+
@overload
655+
def pop(self, __key: _KT, default: _T) -> _VT | _T: ...
654656
def popitem(self) -> tuple[_KT, _VT]: ...
655657
# This overload should be allowed only if the value type is compatible with None.
656658
#

stdlib/weakref.pyi

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -75,7 +75,9 @@ class WeakValueDictionary(MutableMapping[_KT, _VT]):
7575
@overload
7676
def pop(self, key: _KT) -> _VT: ...
7777
@overload
78-
def pop(self, key: _KT, default: _VT | _T = ...) -> _VT | _T: ...
78+
def pop(self, key: _KT, default: _VT) -> _VT: ...
79+
@overload
80+
def pop(self, key: _KT, default: _T) -> _VT | _T: ...
7981
if sys.version_info >= (3, 9):
8082
def __or__(self, other: Mapping[_T1, _T2]) -> WeakValueDictionary[_KT | _T1, _VT | _T2]: ...
8183
def __ror__(self, other: Mapping[_T1, _T2]) -> WeakValueDictionary[_KT | _T1, _VT | _T2]: ...
@@ -118,7 +120,9 @@ class WeakKeyDictionary(MutableMapping[_KT, _VT]):
118120
@overload
119121
def pop(self, key: _KT) -> _VT: ...
120122
@overload
121-
def pop(self, key: _KT, default: _VT | _T = ...) -> _VT | _T: ...
123+
def pop(self, key: _KT, default: _VT) -> _VT: ...
124+
@overload
125+
def pop(self, key: _KT, default: _T) -> _VT | _T: ...
122126
if sys.version_info >= (3, 9):
123127
def __or__(self, other: Mapping[_T1, _T2]) -> WeakKeyDictionary[_KT | _T1, _VT | _T2]: ...
124128
def __ror__(self, other: Mapping[_T1, _T2]) -> WeakKeyDictionary[_KT | _T1, _VT | _T2]: ...

0 commit comments

Comments
 (0)