Skip to content

Commit dbd3ad3

Browse files
authored
Make Mapping.get(default) more constrained (#14360)
1 parent 75d8c88 commit dbd3ad3

File tree

12 files changed

+39
-8
lines changed

12 files changed

+39
-8
lines changed

stdlib/collections/__init__.pyi

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,8 @@ class UserDict(MutableMapping[_KT, _VT]):
108108
@overload
109109
def get(self, key: _KT, default: None = None) -> _VT | None: ...
110110
@overload
111+
def get(self, key: _KT, default: _VT) -> _VT: ...
112+
@overload
111113
def get(self, key: _KT, default: _T) -> _VT | _T: ...
112114

113115
class UserList(MutableSequence[_T]):
@@ -452,6 +454,8 @@ class ChainMap(MutableMapping[_KT, _VT]):
452454
@overload
453455
def get(self, key: _KT, default: None = None) -> _VT | None: ...
454456
@overload
457+
def get(self, key: _KT, default: _VT) -> _VT: ...
458+
@overload
455459
def get(self, key: _KT, default: _T) -> _VT | _T: ...
456460
def __missing__(self, key: _KT) -> _VT: ... # undocumented
457461
def __bool__(self) -> bool: ...

stdlib/importlib/metadata/__init__.pyi

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,6 +140,8 @@ if sys.version_info >= (3, 10) and sys.version_info < (3, 12):
140140
@overload
141141
def get(self, name: _KT, default: None = None) -> _VT | None: ...
142142
@overload
143+
def get(self, name: _KT, default: _VT) -> _VT: ...
144+
@overload
143145
def get(self, name: _KT, default: _T) -> _VT | _T: ...
144146
def __iter__(self) -> Iterator[_KT]: ...
145147
def __contains__(self, *args: object) -> bool: ...

stdlib/types.pyi

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -323,7 +323,9 @@ class MappingProxyType(Mapping[_KT, _VT_co]):
323323
@overload
324324
def get(self, key: _KT, /) -> _VT_co | None: ...
325325
@overload
326-
def get(self, key: _KT, default: _VT_co | _T2, /) -> _VT_co | _T2: ...
326+
def get(self, key: _KT, default: _VT_co, /) -> _VT_co: ... # type: ignore[misc] # pyright: ignore[reportGeneralTypeIssues] # Covariant type as parameter
327+
@overload
328+
def get(self, key: _KT, default: _T2, /) -> _VT_co | _T2: ...
327329
def __class_getitem__(cls, item: Any, /) -> GenericAlias: ...
328330
def __reversed__(self) -> Iterator[_KT]: ...
329331
def __or__(self, value: Mapping[_T1, _T2], /) -> dict[_KT | _T1, _VT_co | _T2]: ...

stdlib/typing.pyi

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -745,7 +745,9 @@ class Mapping(Collection[_KT], Generic[_KT, _VT_co]):
745745
@overload
746746
def get(self, key: _KT, /) -> _VT_co | None: ...
747747
@overload
748-
def get(self, key: _KT, /, default: _VT_co | _T) -> _VT_co | _T: ...
748+
def get(self, key: _KT, /, default: _VT_co) -> _VT_co: ... # type: ignore[misc] # pyright: ignore[reportGeneralTypeIssues] # Covariant type as parameter
749+
@overload
750+
def get(self, key: _KT, /, default: _T) -> _VT_co | _T: ...
749751
def items(self) -> ItemsView[_KT, _VT_co]: ...
750752
def keys(self) -> KeysView[_KT]: ...
751753
def values(self) -> ValuesView[_VT_co]: ...

stdlib/weakref.pyi

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -99,6 +99,8 @@ class WeakValueDictionary(MutableMapping[_KT, _VT]):
9999
@overload
100100
def get(self, key: _KT, default: None = None) -> _VT | None: ...
101101
@overload
102+
def get(self, key: _KT, default: _VT) -> _VT: ...
103+
@overload
102104
def get(self, key: _KT, default: _T) -> _VT | _T: ...
103105
# These are incompatible with Mapping
104106
def keys(self) -> Iterator[_KT]: ... # type: ignore[override]
@@ -149,6 +151,8 @@ class WeakKeyDictionary(MutableMapping[_KT, _VT]):
149151
@overload
150152
def get(self, key: _KT, default: None = None) -> _VT | None: ...
151153
@overload
154+
def get(self, key: _KT, default: _VT) -> _VT: ...
155+
@overload
152156
def get(self, key: _KT, default: _T) -> _VT | _T: ...
153157
# These are incompatible with Mapping
154158
def keys(self) -> Iterator[_KT]: ... # type: ignore[override]

stubs/WebOb/webob/cookies.pyi

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,8 @@ class RequestCookies(MutableMapping[str, str]):
3737
@overload
3838
def get(self, name: str, default: None = None) -> str | None: ...
3939
@overload
40+
def get(self, name: str, default: str) -> str: ...
41+
@overload
4042
def get(self, name: str, default: _T) -> str | _T: ...
4143
def __delitem__(self, name: str) -> None: ...
4244
def keys(self) -> KeysView[str]: ...

stubs/WebOb/webob/multidict.pyi

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,7 +48,9 @@ class MultiDict(MutableMapping[_KT, _VT]):
4848
def __setitem__(self, key: _KT, value: _VT) -> None: ...
4949
def add(self, key: _KT, value: _VT) -> None: ...
5050
@overload
51-
def get(self, key: _KT) -> _VT | None: ...
51+
def get(self, key: _KT, default: None = None) -> _VT | None: ...
52+
@overload
53+
def get(self, key: _KT, default: _VT) -> _VT: ...
5254
@overload
5355
def get(self, key: _KT, default: _T) -> _VT | _T: ...
5456
def getall(self, key: _KT) -> list[_VT]: ...

stubs/boltons/boltons/cacheutils.pyi

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@ class LRI(dict[_KT, _VT]):
2626
@overload
2727
def get(self, key: _KT, default: None = None) -> _VT | None: ...
2828
@overload
29+
def get(self, key: _KT, default: _VT) -> _VT: ...
30+
@overload
2931
def get(self, key: _KT, default: _T) -> _T | _VT: ...
3032
def __delitem__(self, key: _KT) -> None: ...
3133
@overload

stubs/grpcio/grpc/aio/__init__.pyi

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -435,7 +435,9 @@ class Metadata(Mapping[_MetadataKey, _MetadataValue]):
435435
def delete_all(self, key: _MetadataKey) -> None: ...
436436
def __iter__(self) -> Iterator[_MetadataKey]: ...
437437
@overload
438-
def get(self, key: _MetadataKey) -> _MetadataValue | None: ...
438+
def get(self, key: _MetadataKey, default: None = None) -> _MetadataValue | None: ...
439+
@overload
440+
def get(self, key: _MetadataKey, default: _MetadataValue) -> _MetadataValue: ...
439441
@overload
440442
def get(self, key: _MetadataKey, default: _T) -> _MetadataValue | _T: ...
441443
def get_all(self, key: _MetadataKey) -> list[_MetadataValue]: ...

stubs/inifile/inifile.pyi

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -69,7 +69,9 @@ class IniData(MutableMapping[str, str]):
6969
def to_dict(self) -> dict[str, str]: ...
7070
def __len__(self) -> int: ...
7171
@overload
72-
def get(self, name: str) -> str | None: ...
72+
def get(self, name: str, default: None = None) -> str | None: ...
73+
@overload
74+
def get(self, name: str, default: str) -> str: ...
7375
@overload
7476
def get(self, name: str, default: _T) -> str | _T: ...
7577
@overload

stubs/oauthlib/oauthlib/common.pyi

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -52,7 +52,10 @@ class CaseInsensitiveDict(dict[str, Incomplete]):
5252
def __contains__(self, k: object) -> bool: ...
5353
def __delitem__(self, k: str) -> None: ...
5454
def __getitem__(self, k: str): ...
55-
def get(self, k: str, default=None) -> Incomplete | None: ...
55+
@overload
56+
def get(self, k: str, default: None = None) -> Incomplete | None: ...
57+
@overload
58+
def get(self, k: str, default): ...
5659
def __setitem__(self, k: str, v) -> None: ...
5760
def update(self, *args, **kwargs) -> None: ...
5861

stubs/protobuf/google/protobuf/internal/containers.pyi

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,9 @@ class ScalarMap(MutableMapping[_K, _ScalarV]):
7272
@overload
7373
def get(self, key: _K, default: None = None) -> _ScalarV | None: ...
7474
@overload
75-
def get(self, key: _K, default: _ScalarV | _T) -> _ScalarV | _T: ...
75+
def get(self, key: _K, default: _ScalarV) -> _ScalarV: ...
76+
@overload
77+
def get(self, key: _K, default: _T) -> _ScalarV | _T: ...
7678
def setdefault(self, key: _K, value: _ScalarV | None = None) -> _ScalarV: ...
7779
def MergeFrom(self, other: Self): ...
7880
def InvalidateIterators(self) -> None: ...
@@ -95,7 +97,9 @@ class MessageMap(MutableMapping[_K, _MessageV]):
9597
@overload
9698
def get(self, key: _K, default: None = None) -> _MessageV | None: ...
9799
@overload
98-
def get(self, key: _K, default: _MessageV | _T) -> _MessageV | _T: ...
100+
def get(self, key: _K, default: _MessageV) -> _MessageV: ...
101+
@overload
102+
def get(self, key: _K, default: _T) -> _MessageV | _T: ...
99103
def get_or_create(self, key: _K) -> _MessageV: ...
100104
def setdefault(self, key: _K, value: _MessageV | None = None) -> _MessageV: ...
101105
def MergeFrom(self, other: Self): ...

0 commit comments

Comments
 (0)