Skip to content

Commit 3a77831

Browse files
committed
Add VkTools.get_all_iter, VkTools.get_all_slow_iter
1 parent 1f8512e commit 3a77831

1 file changed

Lines changed: 30 additions & 10 deletions

File tree

vk_api/vk_tools.py

Lines changed: 30 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -28,7 +28,8 @@ def __init__(self, vk):
2828
"""
2929
self.vk = vk
3030

31-
def get_all(self, method, max_count, values=None, key='items', limit=None):
31+
def get_all_iter(self, method, max_count, values=None, key='items',
32+
limit=None):
3233
""" Получить все элементы
3334
Работает в методах, где в ответе есть count и items или users
3435
За один запрос получает max_count * 25 элементов
@@ -47,7 +48,7 @@ def get_all(self, method, max_count, values=None, key='items', limit=None):
4748
else:
4849
values = {}
4950

50-
items = []
51+
items_count = 0
5152
offset = 0
5253

5354
while True:
@@ -58,19 +59,29 @@ def get_all(self, method, max_count, values=None, key='items', limit=None):
5859

5960
response = self.vk.method('execute', {'code': run_code})
6061

61-
items += response['items']
62+
items = response['items']
6263
offset = response['offset']
64+
items_count += len(items)
65+
66+
for item in items:
67+
yield item
6368

6469
if offset >= response['count']:
6570
break
6671

6772
if limit and len(items) >= limit:
6873
break
6974

75+
def get_all(self, method, max_count, values=None, key='items', limit=None):
76+
""" Для обратной совместимости, используйте get_all
77+
78+
"""
79+
80+
items = list(self.get_all_iter(method, max_count, values, key, limit))
7081
return {'count': len(items), key: items}
7182

72-
def get_all_slow(self, method, max_count, values=None, key='items',
73-
limit=None):
83+
def get_all_slow_iter(self, method, max_count, values=None, key='items',
84+
limit=None):
7485
""" Получить все элементы
7586
Работает в методах, где в ответе есть count и items или users
7687
@@ -92,27 +103,35 @@ def get_all_slow(self, method, max_count, values=None, key='items',
92103

93104
response = self.vk.method(method, values)
94105
count = response['count']
95-
items = response[key]
106+
items_count = 0
96107

97108
for i in range(max_count, count + 1, max_count):
98109
values.update({
99110
'offset': i
100111
})
101112

102113
response = self.vk.method(method, values)
103-
items += response[key]
114+
items = response[key]
115+
items_count += len(items)
104116

105-
if limit and len(items) >= limit:
117+
for item in items:
118+
yield item
119+
120+
if limit and len(items_count) >= limit:
106121
break
107122

123+
def get_all_slow(self, method, max_count, values=None, key='items',
124+
limit=None):
125+
126+
items = list(self.get_all_slow(method, max_count, values, key, limit))
108127
return {'count': len(items), key: items}
109128

110129

111130
class VkRequestsPool(object):
112131
""" Позволяет сделать несколько обращений к API за один запрос
113132
за счет метода execute
114133
115-
Если ответ от API приходит в виде list (например при вызове users.get),
134+
Если ответ от API приходит в виде list (например при вызове users.get),
116135
то значение записывается с ключем list {'list': [...]}
117136
"""
118137

@@ -237,7 +256,8 @@ def execute(self):
237256
else:
238257
run_code = self.gen_code_many_methods(cur_pool)
239258

240-
response_raw = self.vk.method('execute', {'code': run_code}, raw=True)
259+
response_raw = self.vk.method('execute', {'code': run_code},
260+
raw=True)
241261

242262
response = response_raw['response']
243263
response_errors = response_raw.get('execute_errors')

0 commit comments

Comments
 (0)