Skip to content

Commit 412798f

Browse files
committed
added getall to views
1 parent 5c01f86 commit 412798f

File tree

1 file changed

+67
-11
lines changed

1 file changed

+67
-11
lines changed

aiohttp/multidict.py

Lines changed: 67 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -77,14 +77,14 @@ def __iter__(self):
7777
def __len__(self):
7878
return len(self._items)
7979

80-
def keys(self):
81-
return _KeysView(self._items)
80+
def keys(self, *, getall=False):
81+
return _KeysView(self._items, getall=getall)
8282

83-
def items(self):
84-
return _ItemsView(self._items)
83+
def items(self, *, getall=False):
84+
return _ItemsView(self._items, getall=getall)
8585

86-
def values(self):
87-
return _ValuesView(self._items)
86+
def values(self, *, getall=False):
87+
return _ValuesView(self._items, getall=getall)
8888

8989
def __eq__(self, other):
9090
if not isinstance(other, abc.Mapping):
@@ -217,6 +217,25 @@ def __delitem__(self, key):
217217

218218
class _ItemsView(abc.ItemsView):
219219

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+
220239
def __contains__(self, item):
221240
assert isinstance(item, tuple) or isinstance(item, list)
222241
assert len(item) == 2
@@ -228,21 +247,58 @@ def __iter__(self):
228247

229248
class _ValuesView(abc.ValuesView):
230249

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+
231270
def __contains__(self, value):
232271
values = [item[1] for item in self._mapping]
233272
return value in values
234273

235274
def __iter__(self):
236-
values = [item[1] for item in self._mapping]
275+
values = (item[1] for item in self._mapping)
237276
yield from values
238277

239278

240279
class _KeysView(abc.KeysView):
241280

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+
242300
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
245302

246303
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

Comments
 (0)