Skip to content

Commit fbb9a5e

Browse files
allow arbitrary types in pop() functions.
1 parent d7595e2 commit fbb9a5e

File tree

9 files changed

+35
-26
lines changed

9 files changed

+35
-26
lines changed

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

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
from __future__ import annotations
22

33
import os
4-
from typing import Any, Dict, Generic, Iterable, Mapping, TypeVar, Union
4+
from typing import Any, Dict, Generic, Iterable, Literal, Mapping, TypeVar, Union
55
from typing_extensions import Self, assert_type
66

77
###################################################################
@@ -103,6 +103,15 @@ def test_iterable_tuple_overload(x: Iterable[tuple[int, str]]) -> dict[int, str]
103103
result = d_str.get("key", int_value) # type: ignore[arg-type]
104104

105105

106+
def test_pop_literal(d: dict[Literal["foo", "bar"], int], key: str) -> None:
107+
# Note: annotations also allow using keys of a disjoint type (e.g., int),
108+
# linters / type checkers are free to issue warnings in such cases.
109+
# statically, a .get(arg) is superfluous if the intersection of the
110+
# dict key type and the argument type is empty.
111+
# So we only test a case with non-empty intersection here.
112+
d.pop(key)
113+
114+
106115
# Return values also make things weird
107116

108117
# Pyright doesn't have a version of no-any-return,

stdlib/builtins.pyi

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1226,11 +1226,11 @@ class dict(MutableMapping[_KT, _VT]):
12261226
@overload
12271227
def get(self, key: _KT, default: _T, /) -> _VT | _T: ...
12281228
@overload
1229-
def pop(self, key: _KT, /) -> _VT: ...
1229+
def pop(self, key: object, /) -> _VT: ...
12301230
@overload
1231-
def pop(self, key: _KT, default: _VT, /) -> _VT: ...
1231+
def pop(self, key: object, default: _VT, /) -> _VT: ...
12321232
@overload
1233-
def pop(self, key: _KT, default: _T, /) -> _VT | _T: ...
1233+
def pop(self, key: object, default: _T, /) -> _VT | _T: ...
12341234
def __len__(self) -> int: ...
12351235
def __getitem__(self, key: _KT, /) -> _VT: ...
12361236
def __setitem__(self, key: _KT, value: _VT, /) -> None: ...

stdlib/collections/__init__.pyi

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -382,11 +382,11 @@ class OrderedDict(dict[_KT, _VT]):
382382
def setdefault(self, key: _KT, default: _VT) -> _VT: ...
383383
# Same as dict.pop, but accepts keyword arguments
384384
@overload
385-
def pop(self, key: _KT) -> _VT: ...
385+
def pop(self, key: object) -> _VT: ...
386386
@overload
387-
def pop(self, key: _KT, default: _VT) -> _VT: ...
387+
def pop(self, key: object, default: _VT) -> _VT: ...
388388
@overload
389-
def pop(self, key: _KT, default: _T) -> _VT | _T: ...
389+
def pop(self, key: object, default: _T) -> _VT | _T: ...
390390
def __eq__(self, value: object, /) -> bool: ...
391391
@overload
392392
def __or__(self, value: dict[_KT, _VT], /) -> Self: ...
@@ -471,11 +471,11 @@ class ChainMap(MutableMapping[_KT, _VT]):
471471
@overload
472472
def setdefault(self, key: _KT, default: _VT) -> _VT: ...
473473
@overload
474-
def pop(self, key: _KT) -> _VT: ...
474+
def pop(self, key: Any) -> _VT: ...
475475
@overload
476-
def pop(self, key: _KT, default: _VT) -> _VT: ...
476+
def pop(self, key: Any, default: _VT) -> _VT: ...
477477
@overload
478-
def pop(self, key: _KT, default: _T) -> _VT | _T: ...
478+
def pop(self, key: Any, default: _T) -> _VT | _T: ...
479479
def copy(self) -> Self: ...
480480
__copy__ = copy
481481
# All arguments to `fromkeys` are passed to `dict.fromkeys` at runtime,

stdlib/mailbox.pyi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -88,7 +88,7 @@ class Mailbox(Generic[_MessageT]):
8888
def __len__(self) -> int: ...
8989
def clear(self) -> None: ...
9090
@overload
91-
def pop(self, key: str, default: None = None) -> _MessageT | None: ...
91+
def pop(self, key: str) -> _MessageT | None: ...
9292
@overload
9393
def pop(self, key: str, default: _T) -> _MessageT | _T: ...
9494
def popitem(self) -> tuple[str, _MessageT]: ...

stdlib/typing.pyi

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -795,11 +795,11 @@ class MutableMapping(Mapping[_KT, _VT]):
795795
def __delitem__(self, key: _KT, /) -> None: ...
796796
def clear(self) -> None: ...
797797
@overload
798-
def pop(self, key: _KT, /) -> _VT: ...
798+
def pop(self, key: Any, /) -> _VT: ...
799799
@overload
800-
def pop(self, key: _KT, default: _VT, /) -> _VT: ...
800+
def pop(self, key: Any, default: _VT, /) -> _VT: ...
801801
@overload
802-
def pop(self, key: _KT, default: _T, /) -> _VT | _T: ...
802+
def pop(self, key: Any, default: _T, /) -> _VT | _T: ...
803803
def popitem(self) -> tuple[_KT, _VT]: ...
804804
# This overload should be allowed only if the value type is compatible with None.
805805
#

stdlib/weakref.pyi

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -112,11 +112,11 @@ class WeakValueDictionary(MutableMapping[_KT, _VT]):
112112
def valuerefs(self) -> list[KeyedRef[_KT, _VT]]: ...
113113
def setdefault(self, key: _KT, default: _VT) -> _VT: ...
114114
@overload
115-
def pop(self, key: _KT) -> _VT: ...
115+
def pop(self, key: object) -> _VT: ...
116116
@overload
117-
def pop(self, key: _KT, default: _VT) -> _VT: ...
117+
def pop(self, key: object, default: _VT) -> _VT: ...
118118
@overload
119-
def pop(self, key: _KT, default: _T) -> _VT | _T: ...
119+
def pop(self, key: object, default: _T) -> _VT | _T: ...
120120
@overload
121121
def update(self, other: SupportsKeysAndGetItem[_KT, _VT], /, **kwargs: _VT) -> None: ...
122122
@overload
@@ -168,11 +168,11 @@ class WeakKeyDictionary(MutableMapping[_KT, _VT]):
168168
@overload
169169
def setdefault(self, key: _KT, default: _VT) -> _VT: ...
170170
@overload
171-
def pop(self, key: _KT) -> _VT: ...
171+
def pop(self, key: object) -> _VT: ...
172172
@overload
173-
def pop(self, key: _KT, default: _VT) -> _VT: ...
173+
def pop(self, key: object, default: _VT) -> _VT: ...
174174
@overload
175-
def pop(self, key: _KT, default: _T) -> _VT | _T: ...
175+
def pop(self, key: object, default: _T) -> _VT | _T: ...
176176
@overload
177177
def update(self, dict: SupportsKeysAndGetItem[_KT, _VT], /, **kwargs: _VT) -> None: ...
178178
@overload

stubs/boltons/boltons/cacheutils.pyi

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -31,9 +31,9 @@ class LRI(dict[_KT, _VT]):
3131
def get(self, key: _KT, default: _T) -> _T | _VT: ...
3232
def __delitem__(self, key: _KT) -> None: ...
3333
@overload
34-
def pop(self, key: _KT) -> _VT: ...
34+
def pop(self, key: object) -> _VT: ...
3535
@overload
36-
def pop(self, key: _KT, default: _T) -> _T | _VT: ...
36+
def pop(self, key: object, default: _T) -> _T | _VT: ...
3737
def popitem(self) -> tuple[_KT, _VT]: ...
3838
def clear(self) -> None: ...
3939
def copy(self) -> Self: ...

stubs/boltons/boltons/dictutils.pyi

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -55,7 +55,7 @@ class OneToOne(dict[_KT, _VT]):
5555
inv: OneToOne[_VT, _KT]
5656
def clear(self) -> None: ...
5757
def copy(self) -> Self: ...
58-
def pop(self, key: _KT, default: _VT | _T = ...) -> _VT | _T: ...
58+
def pop(self, key: object, default: _VT | _T = ...) -> _VT | _T: ...
5959
def popitem(self) -> tuple[_KT, _VT]: ...
6060
def setdefault(self, key: _KT, default: _VT | None = None) -> _VT: ...
6161
@classmethod

stubs/yt-dlp/yt_dlp/utils/networking.pyi

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -21,11 +21,11 @@ class HTTPHeaderDict(dict[str, str]):
2121
@overload
2222
def get(self, key: str, /, default: type[NO_DEFAULT] | _T = ...) -> str | _T | type[NO_DEFAULT]: ...
2323
@overload
24-
def pop(self, key: str, /) -> str: ...
24+
def pop(self, key: object, /) -> str: ...
2525
@overload
26-
def pop(self, key: str, /, default: _T) -> str | _T: ...
26+
def pop(self, key: object, /, default: _T) -> str | _T: ...
2727
@overload
28-
def pop(self, key: str, /, default: type[NO_DEFAULT] | _T | str = ...) -> str | _T | type[NO_DEFAULT]: ...
28+
def pop(self, key: object, /, default: type[NO_DEFAULT] | _T | str = ...) -> str | _T | type[NO_DEFAULT]: ...
2929
@overload
3030
def setdefault(self, key: str, /) -> str: ...
3131
@overload

0 commit comments

Comments
 (0)