@@ -77,14 +77,14 @@ def __iter__(self):
77
77
def __len__ (self ):
78
78
return len (self ._items )
79
79
80
- def keys (self ):
81
- return _KeysView (self ._items )
80
+ def keys (self , * , getall = False ):
81
+ return _KeysView (self ._items , getall = getall )
82
82
83
- def items (self ):
84
- return _ItemsView (self ._items )
83
+ def items (self , * , getall = False ):
84
+ return _ItemsView (self ._items , getall = getall )
85
85
86
- def values (self ):
87
- return _ValuesView (self ._items )
86
+ def values (self , * , getall = False ):
87
+ return _ValuesView (self ._items , getall = getall )
88
88
89
89
def __eq__ (self , other ):
90
90
if not isinstance (other , abc .Mapping ):
@@ -217,6 +217,25 @@ def __delitem__(self, key):
217
217
218
218
class _ItemsView (abc .ItemsView ):
219
219
220
+ def __init__ (self , items , * , getall = False ):
221
+ self ._getall = getall
222
+ self ._keys = [item [0 ] for item in items ]
223
+ if not getall :
224
+ self ._keys = set (self ._keys )
225
+
226
+ items_to_use = []
227
+ if getall :
228
+ items_to_use = items
229
+ else :
230
+ for key in self ._keys :
231
+ for k , v in items :
232
+ if k == key :
233
+ items_to_use .append ((k , v ))
234
+ break
235
+ assert len (items_to_use ) == len (self ._keys )
236
+
237
+ super ().__init__ (items_to_use )
238
+
220
239
def __contains__ (self , item ):
221
240
assert isinstance (item , tuple ) or isinstance (item , list )
222
241
assert len (item ) == 2
@@ -228,21 +247,58 @@ def __iter__(self):
228
247
229
248
class _ValuesView (abc .ValuesView ):
230
249
250
+ def __init__ (self , items , * , getall = False ):
251
+ self ._getall = getall
252
+ self ._keys = [item [0 ] for item in items ]
253
+ if not getall :
254
+ self ._keys = set (self ._keys )
255
+
256
+ items_to_use = []
257
+ if getall :
258
+ items_to_use = items
259
+ else :
260
+ for key in self ._keys :
261
+ for k , v in items :
262
+ if k == key :
263
+ items_to_use .append ((k , v ))
264
+ break
265
+
266
+ assert len (items_to_use ) == len (self ._keys )
267
+
268
+ super ().__init__ (items_to_use )
269
+
231
270
def __contains__ (self , value ):
232
271
values = [item [1 ] for item in self ._mapping ]
233
272
return value in values
234
273
235
274
def __iter__ (self ):
236
- values = [ item [1 ] for item in self ._mapping ]
275
+ values = ( item [1 ] for item in self ._mapping )
237
276
yield from values
238
277
239
278
240
279
class _KeysView (abc .KeysView ):
241
280
281
+ def __init__ (self , items , * , getall = False ):
282
+ self ._getall = getall
283
+ self ._keys = [item [0 ] for item in items ]
284
+ if not getall :
285
+ self ._keys = set (self ._keys )
286
+
287
+ items_to_use = []
288
+ if getall :
289
+ items_to_use = items
290
+ else :
291
+ for key in self ._keys :
292
+ for k , v in items :
293
+ if k == key :
294
+ items_to_use .append ((k , v ))
295
+ break
296
+ assert len (items_to_use ) == len (self ._keys )
297
+
298
+ super ().__init__ (items_to_use )
299
+
242
300
def __contains__ (self , key ):
243
- keys = set ([item [0 ] for item in self ._mapping ])
244
- return key in keys
301
+ return key in self ._keys
245
302
246
303
def __iter__ (self ):
247
- keys = set ([item [0 ] for item in self ._mapping ])
248
- yield from keys
304
+ yield from self ._keys
0 commit comments