Skip to content

Commit 69bb68b

Browse files
simplified dict.get to not require overloads
1 parent bfb7342 commit 69bb68b

File tree

2 files changed

+18
-22
lines changed

2 files changed

+18
-22
lines changed

stdlib/@tests/test_cases/builtins/check_dict.py

Lines changed: 16 additions & 15 deletions
Original file line numberDiff line numberDiff line change
@@ -71,34 +71,33 @@ def test_iterable_tuple_overload(x: Iterable[tuple[int, str]]) -> dict[int, str]
7171
int_value = 1
7272

7373
assert_type(d_any["key"], Any)
74-
assert_type(d_any.get("key"), Union[Any, None])
75-
assert_type(d_any.get("key", None), Union[Any, None])
74+
assert_type(d_any.get("key"), Any | None)
75+
assert_type(d_any.get("key", None), Any | None)
7676
assert_type(d_any.get("key", any_value), Any)
77-
assert_type(d_any.get("key", str_value), Any)
78-
assert_type(d_any.get("key", int_value), Any)
77+
assert_type(d_any.get("key", str_value), Any | str)
78+
assert_type(d_any.get("key", int_value), Any | int)
7979

8080
assert_type(d_str["key"], str)
81-
assert_type(d_str.get("key"), Union[str, None])
82-
assert_type(d_str.get("key", None), Union[str, None])
81+
assert_type(d_str.get("key"), str | None)
82+
assert_type(d_str.get("key", None), str | None)
8383
# Pyright has str instead of Any here
84-
assert_type(d_str.get("key", any_value), Any) # pyright: ignore[reportAssertTypeFailure]
84+
assert_type(d_str.get("key", any_value), str | Any)
8585
assert_type(d_str.get("key", str_value), str)
86-
assert_type(d_str.get("key", int_value), Union[str, int])
86+
assert_type(d_str.get("key", int_value), str | int)
8787

8888
# Now with context!
8989
result: str
9090
result = d_any["key"]
9191
result = d_any.get("key") # type: ignore[assignment]
9292
result = d_any.get("key", None) # type: ignore[assignment]
93-
result = d_any.get("key", any_value)
94-
result = d_any.get("key", str_value)
95-
result = d_any.get("key", int_value)
93+
result = d_any.get("key", any_value) # OK
94+
result = d_any.get("key", str_value) # OK
95+
result = d_any.get("key", int_value) # type: ignore[assignment]
9696

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

@@ -143,8 +142,10 @@ def test9() -> str:
143142
return d_str.get("key", None) # type: ignore[return-value]
144143

145144

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

149150

150151
def test11() -> str:

stdlib/builtins.pyi

Lines changed: 2 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,7 @@ _SupportsAnextT_co = TypeVar("_SupportsAnextT_co", bound=SupportsAnext[Any], cov
9696
_AwaitableT = TypeVar("_AwaitableT", bound=Awaitable[Any])
9797
_AwaitableT_co = TypeVar("_AwaitableT_co", bound=Awaitable[Any], covariant=True)
9898
_P = ParamSpec("_P")
99+
_NoneDefaultT = TypeVar("_NoneDefaultT", default=None)
99100

100101
# Type variables for slice
101102
_StartT_co = TypeVar("_StartT_co", covariant=True, default=Any) # slice -> slice[Any, Any, Any]
@@ -1218,13 +1219,7 @@ class dict(MutableMapping[_KT, _VT]):
12181219
@classmethod
12191220
@overload
12201221
def fromkeys(cls, iterable: Iterable[_T], value: _S, /) -> dict[_T, _S]: ...
1221-
# Positional-only in dict, but not in MutableMapping
1222-
@overload # type: ignore[override]
1223-
def get(self, key: _KT, default: None = None, /) -> _VT | None: ...
1224-
@overload
1225-
def get(self, key: _KT, default: _VT, /) -> _VT: ...
1226-
@overload
1227-
def get(self, key: _KT, default: _T, /) -> _VT | _T: ...
1222+
def get(self, key: _KT, default: _NoneDefaultT = None, /) -> _VT | _NoneDefaultT: ... # type: ignore[assignment]
12281223
@overload
12291224
def pop(self, key: _KT, /) -> _VT: ...
12301225
@overload

0 commit comments

Comments
 (0)