1+ # pyright: reportIncompatibleMethodOverride=false
12import abc
23import typing
34from typing import Any , Generator
2223
2324# Using types.Union instead of | since Python 3.7 doesn't fully support it
2425DictUpdateArgs = types .Union [
25- types .Mapping ,
26- types .Iterable [types .Union [types .Tuple [Any , Any ], types .Mapping ]],
26+ types .Mapping [types .Any , types .Any ],
27+ types .Iterable [
28+ types .Union [types .Tuple [Any , Any ], types .Mapping [types .Any , types .Any ]]
29+ ],
2730 '_typeshed.SupportsKeysAndGetItem[KT, VT]' ,
2831]
2932
3033
3134class CastedDictBase (types .Dict [KT , VT ], abc .ABC ):
32- _key_cast : KT_cast
33- _value_cast : VT_cast
35+ _key_cast : KT_cast [ KT ]
36+ _value_cast : VT_cast [ VT ]
3437
3538 def __init__ (
3639 self ,
37- key_cast : KT_cast = None ,
38- value_cast : VT_cast = None ,
39- * args : DictUpdateArgs ,
40+ key_cast : KT_cast [ KT ] = None ,
41+ value_cast : VT_cast [ VT ] = None ,
42+ * args : DictUpdateArgs [ KT , VT ] ,
4043 ** kwargs : VT ,
4144 ) -> None :
4245 self ._value_cast = value_cast
4346 self ._key_cast = key_cast
4447 self .update (* args , ** kwargs )
4548
46- def update (self , * args : DictUpdateArgs , ** kwargs : VT ) -> None :
49+ def update (
50+ self , * args : DictUpdateArgs [types .Any , types .Any ], ** kwargs : types .Any
51+ ) -> None :
4752 if args :
4853 kwargs .update (* args )
4954
@@ -93,7 +98,7 @@ class CastedDict(CastedDictBase[KT, VT]):
9398 {1: 2, '3': '4', '5': '6', '7': '8'}
9499 '''
95100
96- def __setitem__ (self , key : Any , value : Any ) -> None :
101+ def __setitem__ (self , key : typing . Any , value : typing . Any ) -> None :
97102 if self ._value_cast is not None :
98103 value = self ._value_cast (value )
99104
@@ -146,13 +151,13 @@ class LazyCastedDict(CastedDictBase[KT, VT]):
146151 '4'
147152 '''
148153
149- def __setitem__ (self , key : Any , value : Any ) -> None :
154+ def __setitem__ (self , key : types . Any , value : types . Any ):
150155 if self ._key_cast is not None :
151156 key = self ._key_cast (key )
152157
153158 super ().__setitem__ (key , value )
154159
155- def __getitem__ (self , key : Any ) -> VT :
160+ def __getitem__ (self , key : types . Any ) -> VT :
156161 if self ._key_cast is not None :
157162 key = self ._key_cast (key )
158163
@@ -163,9 +168,7 @@ def __getitem__(self, key: Any) -> VT:
163168
164169 return value
165170
166- def items ( # type: ignore
167- self ,
168- ) -> Generator [types .Tuple [KT , VT ], None , None ]:
171+ def items (self ) -> Generator [tuple [KT , VT ], None , None ]: # type: ignore
169172 if self ._value_cast is None :
170173 yield from super ().items ()
171174 else :
@@ -247,7 +250,7 @@ def append(self, value: HT) -> None:
247250 self ._set .add (value )
248251 super ().append (value )
249252
250- def __contains__ (self , item ):
253+ def __contains__ (self , item : HT ) -> bool : # type: ignore
251254 return item in self ._set
252255
253256 @types .overload
@@ -258,29 +261,37 @@ def __setitem__(self, indices: types.SupportsIndex, values: HT) -> None:
258261 def __setitem__ (self , indices : slice , values : types .Iterable [HT ]) -> None :
259262 ...
260263
261- def __setitem__ (self , indices , values ) -> None :
264+ def __setitem__ (
265+ self ,
266+ indices : types .Union [slice , types .SupportsIndex ],
267+ values : types .Union [types .Iterable [HT ], HT ],
268+ ) -> None :
262269 if isinstance (indices , slice ):
270+ values = types .cast (types .Iterable [HT ], values )
263271 if self .on_duplicate == 'ignore' :
264272 raise RuntimeError (
265273 'ignore mode while setting slices introduces ambiguous '
266274 'behaviour and is therefore not supported'
267275 )
268276
269- duplicates = set (values ) & self ._set
270- if duplicates and values != self [indices ]:
271- raise ValueError ('Duplicate values: %s' % duplicates )
277+ duplicates : types . Set [ HT ] = set (values ) & self ._set
278+ if duplicates and values != list ( self [indices ]) :
279+ raise ValueError (f 'Duplicate values: { duplicates } ' )
272280
273281 self ._set .update (values )
274- super ().__setitem__ (indices , values )
275282 else :
283+ values = types .cast (HT , values )
276284 if values in self ._set and values != self [indices ]:
277285 if self .on_duplicate == 'raise' :
278- raise ValueError ('Duplicate value: %s' % values )
286+ raise ValueError (f 'Duplicate value: { values } ' )
279287 else :
280288 return
281289
282290 self ._set .add (values )
283- super ().__setitem__ (indices , values )
291+
292+ super ().__setitem__ (
293+ types .cast (slice , indices ), types .cast (types .List [HT ], values )
294+ )
284295
285296 def __delitem__ (
286297 self , index : types .Union [types .SupportsIndex , slice ]
0 commit comments