Skip to content

Commit 300b443

Browse files
committed
Fix mapping.py typing
1 parent a872c79 commit 300b443

File tree

1 file changed

+48
-18
lines changed

1 file changed

+48
-18
lines changed

cloudbot/util/mapping.py

Lines changed: 48 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,14 @@
11
import weakref
22
from collections import defaultdict
3-
from typing import TYPE_CHECKING, Generic, MutableMapping, TypeVar, cast
3+
from typing import (
4+
TYPE_CHECKING,
5+
Generic,
6+
Optional,
7+
Protocol,
8+
TypeVar,
9+
Union,
10+
cast,
11+
)
412

513
__all__ = (
614
"KeyFoldDict",
@@ -10,51 +18,73 @@
1018
)
1119

1220

13-
K = TypeVar("K", bound=str)
21+
K_contra = TypeVar("K_contra", bound=str, contravariant=True)
1422
V = TypeVar("V")
23+
T = TypeVar("T")
24+
1525

1626
if TYPE_CHECKING:
1727

18-
class MapBase(MutableMapping[K, V]):
19-
...
28+
class MapBase(Protocol[K_contra, V]):
29+
def __getitem__(self, item: K_contra) -> V:
30+
...
31+
32+
def __delitem__(self, item: K_contra) -> None:
33+
...
34+
35+
def __setitem__(self, item: K_contra, value: V) -> None:
36+
...
37+
38+
def get(self, item: K_contra, default: V = None) -> Optional[V]:
39+
...
40+
41+
def setdefault(
42+
self, key: K_contra, default: Union[V, T] = None
43+
) -> Union[V, T]:
44+
...
45+
46+
def pop(
47+
self, key: K_contra, default: Union[V, T] = None
48+
) -> Union[V, T]:
49+
...
2050

2151
else:
2252

23-
class MapBase(Generic[K, V]):
53+
class MapBase(Generic[K_contra, V]):
2454
...
2555

2656

27-
class KeyFoldMixin(MapBase[K, V]):
57+
class KeyFoldMixin(MapBase[K_contra, V]):
2858
"""
2959
A mixin for Mapping to allow for case-insensitive keys
3060
"""
3161

32-
def __getitem__(self, item: K) -> V:
33-
return super().__getitem__(cast(K, item.casefold()))
62+
def __getitem__(self, item: K_contra) -> V:
63+
return super().__getitem__(cast(K_contra, item.casefold()))
3464

35-
def __setitem__(self, key: K, value: V) -> None:
36-
return super().__setitem__(cast(K, key.casefold()), value)
65+
def __setitem__(self, key: K_contra, value: V) -> None:
66+
return super().__setitem__(cast(K_contra, key.casefold()), value)
3767

38-
def __delitem__(self, key: K) -> None:
39-
return super().__delitem__(cast(K, key.casefold()))
68+
def __delitem__(self, key: K_contra) -> None:
69+
return super().__delitem__(cast(K_contra, key.casefold()))
4070

41-
def pop(self, key: K, *args) -> V:
71+
def pop(self, key: K_contra, *args) -> V:
4272
"""
4373
Wraps `dict.pop`
4474
"""
45-
return super().pop(cast(K, key.casefold()), *args)
75+
return super().pop(cast(K_contra, key.casefold()), *args)
4676

47-
def get(self, key: K, default=None):
77+
def get(self, key: K_contra, default=None):
4878
"""
4979
Wrap `dict.get`
5080
"""
51-
return super().get(cast(K, key.casefold()), default)
81+
return super().get(cast(K_contra, key.casefold()), default)
5282

53-
def setdefault(self, key: K, default=None):
83+
def setdefault(self, key: K_contra, default=None):
5484
"""
5585
Wrap `dict.setdefault`
5686
"""
57-
return super().setdefault(cast(K, key.casefold()), default)
87+
return super().setdefault(cast(K_contra, key.casefold()), default)
5888

5989
def update(self, *args, **kwargs):
6090
"""

0 commit comments

Comments
 (0)