Skip to content

Commit 7e1dfd9

Browse files
authored
[boltons] Improve dictutils stubs (#15879)
1 parent 560611a commit 7e1dfd9

1 file changed

Lines changed: 36 additions & 17 deletions

File tree

stubs/boltons/boltons/dictutils.pyi

Lines changed: 36 additions & 17 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
from _typeshed import SupportsKeysAndGetItem
2-
from collections.abc import Generator, ItemsView, Iterable, KeysView, ValuesView
3-
from typing import NoReturn, TypeAlias, TypeVar, overload
2+
from collections.abc import Generator, ItemsView, Iterable, Iterator, KeysView, ValuesView
3+
from typing import Any, Generic, NoReturn, TypeAlias, TypeVar, overload
44
from typing_extensions import Self
55

66
_KT = TypeVar("_KT")
@@ -12,17 +12,26 @@ class OrderedMultiDict(dict[_KT, _VT]):
1212
def addlist(self, k: _KT, v: Iterable[_VT]) -> None: ...
1313
def clear(self) -> None: ...
1414
def copy(self) -> Self: ...
15-
def counts(self) -> Self: ...
15+
def counts(self) -> OrderedMultiDict[_KT, int]: ...
16+
17+
@overload # type: ignore[override]
18+
@classmethod
19+
def fromkeys(cls, keys: Iterable[_KT], default: None = None) -> OrderedMultiDict[_KT, Any | None]: ...
20+
@overload
1621
@classmethod
17-
def fromkeys(cls, keys: _KT, default: _VT | None = None) -> Self: ... # type: ignore[override]
22+
def fromkeys(cls, keys: Iterable[_KT], default: _T) -> OrderedMultiDict[_KT, _T]: ...
1823

1924
@overload # type: ignore[override]
2025
def get(self, k: _KT, default: None = None) -> _VT | None: ...
2126
@overload
2227
def get(self, k: _KT, default: _VT) -> _VT: ...
2328

24-
def getlist(self, k: _KT, default: list[_VT] = ...) -> list[_VT]: ...
25-
def inverted(self) -> Self: ...
29+
@overload
30+
def getlist(self, k: _KT) -> list[_VT]: ...
31+
@overload
32+
def getlist(self, k: _KT, default: _T) -> list[_VT] | _T: ...
33+
34+
def inverted(self) -> OrderedMultiDict[_VT, _KT]: ...
2635
def items(self, multi: bool = False) -> list[tuple[_KT, _VT]]: ... # type: ignore[override]
2736
def iteritems(self, multi: bool = False) -> Generator[tuple[_KT, _VT]]: ...
2837
def iterkeys(self, multi: bool = False) -> Generator[_KT]: ...
@@ -61,31 +70,41 @@ class OneToOne(dict[_KT, _VT]):
6170
def copy(self) -> Self: ...
6271
def pop(self, key: _KT, default: _VT | _T = ...) -> _VT | _T: ...
6372
def popitem(self) -> tuple[_KT, _VT]: ...
64-
def setdefault(self, key: _KT, default: _VT | None = None) -> _VT: ...
73+
74+
@overload
75+
def setdefault(self, key: _KT, default: None = None) -> _VT | None: ...
76+
@overload
77+
def setdefault(self, key: _KT, default: _VT) -> _VT: ...
78+
6579
@classmethod
6680
def unique(cls, *a, **kw) -> Self: ...
6781
def update(self, dict_or_iterable, **kw) -> None: ... # type: ignore[override]
6882

69-
class ManyToMany(dict[_KT, frozenset[_VT]]):
83+
class ManyToMany(Generic[_KT, _VT]):
7084
data: dict[_KT, set[_VT]]
71-
inv: dict[_VT, set[_KT]]
72-
# def __contains__(self, key: _KT): ...
85+
inv: ManyToMany[_VT, _KT]
86+
def __contains__(self, key: object) -> bool: ...
7387
def __delitem__(self, key: _KT) -> None: ...
7488
def __eq__(self, other): ...
75-
def __getitem__(self, key: _KT): ...
89+
def __getitem__(self, key: _KT) -> frozenset[_VT]: ...
7690
def __init__(
77-
self, items: ManyToMany[_KT, _VT] | SupportsKeysAndGetItem[_KT, _VT] | tuple[_KT, _VT] | None = None
91+
self, items: ManyToMany[_KT, _VT] | SupportsKeysAndGetItem[_KT, _VT] | Iterable[tuple[_KT, _VT]] | None = None
7892
) -> None: ...
79-
def __iter__(self): ...
80-
def __len__(self): ...
93+
def __iter__(self) -> Iterator[_KT]: ...
94+
def __len__(self) -> int: ...
8195
def __setitem__(self, key: _KT, vals: Iterable[_VT]) -> None: ...
8296
def add(self, key: _KT, val: _VT) -> None: ...
83-
def get(self, key: _KT, default: frozenset[_VT] = ...) -> frozenset[_VT]: ... # type: ignore[override]
97+
98+
@overload
99+
def get(self, key: _KT) -> frozenset[_VT]: ...
100+
@overload
101+
def get(self, key: _KT, default: _T) -> frozenset[_VT] | _T: ...
102+
84103
def iteritems(self) -> Generator[tuple[_KT, _VT]]: ...
85-
def keys(self): ...
104+
def keys(self) -> KeysView[_KT]: ...
86105
def remove(self, key: _KT, val: _VT) -> None: ...
87106
def replace(self, key: _KT, newkey: _KT) -> None: ...
88-
def update(self, iterable: ManyToMany[_KT, _VT] | SupportsKeysAndGetItem[_KT, _VT] | tuple[_KT, _VT]) -> None: ... # type: ignore[override]
107+
def update(self, iterable: ManyToMany[_KT, _VT] | SupportsKeysAndGetItem[_KT, _VT] | Iterable[tuple[_KT, _VT]]) -> None: ...
89108

90109
def subdict(d: dict[_KT, _VT], keep: Iterable[_KT] | None = None, drop: Iterable[_KT] | None = None) -> dict[_KT, _VT]: ...
91110

0 commit comments

Comments
 (0)