@@ -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
111130class 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