Skip to content
3 changes: 0 additions & 3 deletions stdlib/@tests/stubtest_allowlists/py313.txt
Original file line number Diff line number Diff line change
Expand Up @@ -105,9 +105,6 @@ multiprocessing.managers._BaseDictProxy.keys
multiprocessing.managers._BaseDictProxy.popitem
multiprocessing.managers._BaseDictProxy.values

# To match `dict`, we lie about the runtime, but use overloads to match the correct behavior
types.MappingProxyType.get

typing_extensions.Protocol # Super-special typing primitive


Expand Down
3 changes: 0 additions & 3 deletions stdlib/@tests/stubtest_allowlists/py314.txt
Original file line number Diff line number Diff line change
Expand Up @@ -139,9 +139,6 @@ multiprocessing.managers._BaseDictProxy.keys
multiprocessing.managers._BaseDictProxy.popitem
multiprocessing.managers._BaseDictProxy.values

# To match `dict`, we lie about the runtime, but use overloads to match the correct behavior
types.MappingProxyType.get

typing_extensions.Protocol # Super-special typing primitive


Expand Down
37 changes: 21 additions & 16 deletions stdlib/@tests/test_cases/builtins/check_dict.py
Original file line number Diff line number Diff line change
Expand Up @@ -71,34 +71,35 @@ def test_iterable_tuple_overload(x: Iterable[tuple[int, str]]) -> dict[int, str]
int_value = 1

assert_type(d_any["key"], Any)
assert_type(d_any.get("key"), Union[Any, None])
assert_type(d_any.get("key", None), Union[Any, None])
assert_type(d_any.get("key"), Any | None)
assert_type(d_any.get("key", None), Any | None)
assert_type(d_any.get("key", any_value), Any)
assert_type(d_any.get("key", str_value), Any)
assert_type(d_any.get("key", int_value), Any)
assert_type(d_any.get("key", str_value), Any | str)
assert_type(d_any.get("key", int_value), Any | int)

assert_type(d_str["key"], str)
assert_type(d_str.get("key"), Union[str, None])
assert_type(d_str.get("key", None), Union[str, None])
assert_type(d_str.get("key"), str | None)
assert_type(d_str.get("key", None), str | None)
# Pyright has str instead of Any here
assert_type(d_str.get("key", any_value), Any) # pyright: ignore[reportAssertTypeFailure]
assert_type(d_str.get("key", any_value), str | Any)
assert_type(d_str.get("key", str_value), str)
assert_type(d_str.get("key", int_value), Union[str, int])
assert_type(d_str.get("key", int_value), str | int)

# Now with context!
# Note: One would expect 'assignment' rather than 'arg-type' error code,
# but this is a bug in mypy (https://github.com/python/mypy/issues/20576)
result: str
result = d_any["key"]
result = d_any.get("key") # type: ignore[assignment]
result = d_any.get("key", None) # type: ignore[assignment]
result = d_any.get("key", None) # type: ignore[arg-type]
result = d_any.get("key", any_value)
result = d_any.get("key", str_value)
result = d_any.get("key", int_value)
result = d_any.get("key", int_value) # type: ignore[arg-type]

result = d_str["key"]
result = d_str.get("key") # type: ignore[assignment]
result = d_str.get("key", None) # type: ignore[assignment]
# Pyright has str | None here, see https://github.com/microsoft/pyright/discussions/9570
result = d_str.get("key", any_value) # pyright: ignore[reportAssignmentType]
result = d_str.get("key", None) # type: ignore[arg-type]
result = d_str.get("key", any_value)
result = d_str.get("key", str_value)
result = d_str.get("key", int_value) # type: ignore[arg-type]

Expand Down Expand Up @@ -140,11 +141,15 @@ def test8() -> str:


def test9() -> str:
return d_str.get("key", None) # type: ignore[return-value]
# Note: One would expect 'return-value' rather than 'arg-type' error code,
# but this is a bug in mypy (https://github.com/python/mypy/issues/20576)
return d_str.get("key", None) # type: ignore[arg-type]


def test10() -> str:
return d_str.get("key", any_value) # type: ignore[no-any-return]
# Pyright doesn't have a version of no-any-return,
# and mypy doesn't have a type: ignore that pyright will ignore.
# def test10() -> str:
# return d_str.get("key", any_value) # mypy: ignore[no-any-return]


def test11() -> str:
Expand Down
4 changes: 1 addition & 3 deletions stdlib/builtins.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -1232,9 +1232,7 @@ class dict(MutableMapping[_KT, _VT]):
def fromkeys(cls, iterable: Iterable[_T], value: _S, /) -> dict[_T, _S]: ...
# Positional-only in dict, but not in MutableMapping
@overload # type: ignore[override]
def get(self, key: _KT, default: None = None, /) -> _VT | None: ...
@overload
def get(self, key: _KT, default: _VT, /) -> _VT: ...
def get(self, key: _KT, /) -> _VT | None: ...
@overload
def get(self, key: _KT, default: _T, /) -> _VT | _T: ...
@overload
Expand Down
8 changes: 2 additions & 6 deletions stdlib/collections/__init__.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -105,9 +105,7 @@ class UserDict(MutableMapping[_KT, _VT]):
def __ior__(self, other: Iterable[tuple[_KT, _VT]]) -> Self: ...
if sys.version_info >= (3, 12):
@overload
def get(self, key: _KT, default: None = None) -> _VT | None: ...
@overload
def get(self, key: _KT, default: _VT) -> _VT: ...
def get(self, key: _KT) -> _VT | None: ...
@overload
def get(self, key: _KT, default: _T) -> _VT | _T: ...

Expand Down Expand Up @@ -473,9 +471,7 @@ class ChainMap(MutableMapping[_KT, _VT]):
def __len__(self) -> int: ...
def __contains__(self, key: object) -> bool: ...
@overload
def get(self, key: _KT, default: None = None) -> _VT | None: ...
@overload
def get(self, key: _KT, default: _VT) -> _VT: ...
def get(self, key: _KT) -> _VT | None: ...
@overload
def get(self, key: _KT, default: _T) -> _VT | _T: ...
def __missing__(self, key: _KT) -> _VT: ... # undocumented
Expand Down
4 changes: 1 addition & 3 deletions stdlib/importlib/metadata/__init__.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -163,9 +163,7 @@ if sys.version_info < (3, 12):
class Deprecated(Generic[_KT, _VT]):
def __getitem__(self, name: _KT) -> _VT: ...
@overload
def get(self, name: _KT, default: None = None) -> _VT | None: ...
@overload
def get(self, name: _KT, default: _VT) -> _VT: ...
def get(self, name: _KT) -> _VT | None: ...
@overload
def get(self, name: _KT, default: _T) -> _VT | _T: ...
def __iter__(self) -> Iterator[_KT]: ...
Expand Down
4 changes: 1 addition & 3 deletions stdlib/os/__init__.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -715,9 +715,7 @@ class _Environ(MutableMapping[AnyStr, AnyStr], Generic[AnyStr]):
decodevalue: _EnvironCodeFunc[AnyStr],
) -> None: ...
@overload
def get(self, key: AnyStr, default: None = None) -> AnyStr | None: ...
@overload
def get(self, key: AnyStr, default: AnyStr) -> AnyStr: ...
def get(self, key: AnyStr) -> AnyStr | None: ...
@overload
def get(self, key: AnyStr, default: _T) -> AnyStr | _T: ...
@overload
Expand Down
2 changes: 0 additions & 2 deletions stdlib/types.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -281,8 +281,6 @@ class MappingProxyType(Mapping[_KT_co, _VT_co]): # type: ignore[type-var] # py
@overload
def get(self, key: _KT_co, /) -> _VT_co | None: ... # type: ignore[misc] # pyright: ignore[reportGeneralTypeIssues] # Covariant type as parameter
@overload
def get(self, key: _KT_co, default: _VT_co, /) -> _VT_co: ... # type: ignore[misc] # pyright: ignore[reportGeneralTypeIssues] # Covariant type as parameter
@overload
def get(self, key: _KT_co, default: _T2, /) -> _VT_co | _T2: ... # type: ignore[misc] # pyright: ignore[reportGeneralTypeIssues] # Covariant type as parameter
def __class_getitem__(cls, item: Any, /) -> GenericAlias: ...
def __reversed__(self) -> Iterator[_KT_co]: ...
Expand Down
2 changes: 0 additions & 2 deletions stdlib/typing.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -799,8 +799,6 @@ class Mapping(Collection[_KT], Generic[_KT, _VT_co]):
@overload
def get(self, key: _KT, /) -> _VT_co | None: ...
@overload
def get(self, key: _KT, default: _VT_co, /) -> _VT_co: ... # type: ignore[misc] # pyright: ignore[reportGeneralTypeIssues] # Covariant type as parameter
@overload
def get(self, key: _KT, default: _T, /) -> _VT_co | _T: ...
def items(self) -> ItemsView[_KT, _VT_co]: ...
def keys(self) -> KeysView[_KT]: ...
Expand Down
8 changes: 2 additions & 6 deletions stdlib/weakref.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -99,9 +99,7 @@ class WeakValueDictionary(MutableMapping[_KT, _VT]):
__copy__ = copy
def __deepcopy__(self, memo: Any) -> Self: ...
@overload
def get(self, key: _KT, default: None = None) -> _VT | None: ...
@overload
def get(self, key: _KT, default: _VT) -> _VT: ...
def get(self, key: _KT) -> _VT | None: ...
@overload
def get(self, key: _KT, default: _T) -> _VT | _T: ...
# These are incompatible with Mapping
Expand Down Expand Up @@ -152,9 +150,7 @@ class WeakKeyDictionary(MutableMapping[_KT, _VT]):
__copy__ = copy
def __deepcopy__(self, memo: Any) -> Self: ...
@overload
def get(self, key: _KT, default: None = None) -> _VT | None: ...
@overload
def get(self, key: _KT, default: _VT) -> _VT: ...
def get(self, key: _KT) -> _VT | None: ...
@overload
def get(self, key: _KT, default: _T) -> _VT | _T: ...
# These are incompatible with Mapping
Expand Down
4 changes: 1 addition & 3 deletions stubs/WebOb/webob/cookies.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -35,9 +35,7 @@ class RequestCookies(MutableMapping[str, str]):
def __setitem__(self, name: str, value: str) -> None: ...
def __getitem__(self, name: str) -> str: ...
@overload
def get(self, name: str, default: None = None) -> str | None: ...
@overload
def get(self, name: str, default: str) -> str: ...
def get(self, name: str) -> str | None: ...
@overload
def get(self, name: str, default: _T) -> str | _T: ...
def __delitem__(self, name: str) -> None: ...
Expand Down
4 changes: 1 addition & 3 deletions stubs/WebOb/webob/multidict.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -49,9 +49,7 @@ class MultiDict(MutableMapping[_KT, _VT]):
def __setitem__(self, key: _KT, value: _VT) -> None: ...
def add(self, key: _KT, value: _VT) -> None: ...
@overload
def get(self, key: _KT, default: None = None) -> _VT | None: ...
@overload
def get(self, key: _KT, default: _VT) -> _VT: ...
def get(self, key: _KT) -> _VT | None: ...
@overload
def get(self, key: _KT, default: _T) -> _VT | _T: ...
def getall(self, key: _KT) -> list[_VT]: ...
Expand Down
6 changes: 2 additions & 4 deletions stubs/boltons/boltons/cacheutils.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -24,11 +24,9 @@ class LRI(dict[_KT, _VT]):
def __setitem__(self, key: _KT, value: _VT) -> None: ...
def __getitem__(self, key: _KT) -> _VT: ...
@overload
def get(self, key: _KT, default: None = None) -> _VT | None: ...
def get(self, key: _KT) -> _VT | None: ...
@overload
def get(self, key: _KT, default: _VT) -> _VT: ...
@overload
def get(self, key: _KT, default: _T) -> _T | _VT: ...
def get(self, key: _KT, default: _T) -> _VT | _T: ...
def __delitem__(self, key: _KT) -> None: ...
@overload
def pop(self, key: _KT) -> _VT: ...
Expand Down
4 changes: 1 addition & 3 deletions stubs/grpcio/grpc/aio/__init__.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -454,9 +454,7 @@ class Metadata(Mapping[_MetadataKey, _MetadataValue]):
def delete_all(self, key: _MetadataKey) -> None: ...
def __iter__(self) -> Iterator[_MetadataKey]: ...
@overload
def get(self, key: _MetadataKey, default: None = None) -> _MetadataValue | None: ...
@overload
def get(self, key: _MetadataKey, default: _MetadataValue) -> _MetadataValue: ...
def get(self, key: _MetadataKey) -> _MetadataValue | None: ...
@overload
def get(self, key: _MetadataKey, default: _T) -> _MetadataValue | _T: ...
def get_all(self, key: _MetadataKey) -> list[_MetadataValue]: ...
Expand Down
4 changes: 1 addition & 3 deletions stubs/inifile/inifile.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -68,9 +68,7 @@ class IniData(MutableMapping[str, str]):
def to_dict(self) -> dict[str, str]: ...
def __len__(self) -> int: ...
@overload
def get(self, name: str, default: None = None) -> str | None: ...
@overload
def get(self, name: str, default: str) -> str: ...
def get(self, name: str) -> str | None: ...
@overload
def get(self, name: str, default: _T) -> str | _T: ...
@overload
Expand Down
8 changes: 2 additions & 6 deletions stubs/protobuf/google/protobuf/internal/containers.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -78,9 +78,7 @@ class ScalarMap(MutableMapping[_K, _ScalarV]):
) -> None: ...
def __getitem__(self, key: _K) -> _ScalarV: ...
@overload
def get(self, key: _K, default: None = None) -> _ScalarV | None: ...
@overload
def get(self, key: _K, default: _ScalarV) -> _ScalarV: ...
def get(self, key: _K) -> _ScalarV | None: ...
@overload
def get(self, key: _K, default: _T) -> _ScalarV | _T: ...
def __setitem__(self, key: _K, value: _ScalarV) -> None: ...
Expand All @@ -106,9 +104,7 @@ class MessageMap(MutableMapping[_K, _MessageV]):
def __getitem__(self, key: _K) -> _MessageV: ...
def get_or_create(self, key: _K) -> _MessageV: ...
@overload
def get(self, key: _K, default: None = None) -> _MessageV | None: ...
@overload
def get(self, key: _K, default: _MessageV) -> _MessageV: ...
def get(self, key: _K) -> _MessageV | None: ...
@overload
def get(self, key: _K, default: _T) -> _MessageV | _T: ...
def __setitem__(self, key: _K, value: _MessageV) -> None: ...
Expand Down
6 changes: 5 additions & 1 deletion stubs/setuptools/setuptools/__init__.pyi
Original file line number Diff line number Diff line change
Expand Up @@ -38,6 +38,7 @@ _CommandT = TypeVar("_CommandT", bound=_Command)
_DistributionT = TypeVar("_DistributionT", bound=_Distribution, default=Distribution)
_KT = TypeVar("_KT")
_VT_co = TypeVar("_VT_co", covariant=True)
_T = TypeVar("_T")

__all__ = [
"setup",
Expand All @@ -58,7 +59,10 @@ __version__: str
@type_check_only
class _DictLike(Protocol[_KT, _VT_co]):
# See note about using _VT_co instead of Any
def get(self, key: _KT, default: Any | None = None, /) -> _VT_co | None: ...
@overload
def get(self, key: _KT, /) -> _VT_co | None: ...
@overload
def get(self, key: _KT, default: _T, /) -> _VT_co | _T: ...
def items(self) -> ItemsView[_KT, _VT_co]: ...
def keys(self) -> Iterable[_KT]: ...
def __getitem__(self, key: _KT, /) -> _VT_co: ...
Expand Down
Loading