@@ -30,7 +30,7 @@ def __init__(self, vk):
3030 self .vk = vk
3131
3232 def get_all_iter (self , method , max_count , values = None , key = 'items' ,
33- limit = None ):
33+ limit = None , stop_fn = None ):
3434 """ Получить все элементы.
3535 Работает в методах, где в ответе есть count и items или users.
3636 За один запрос получает max_count * 25 элементов
@@ -51,6 +51,9 @@ def get_all_iter(self, method, max_count, values=None, key='items',
5151 :param limit: ограничение на кол-во получаемых элементов,
5252 но может прийти больше
5353 :type limit: int
54+
55+ :param stop_fn: функция, отвечающая за выход из цикла
56+ :type stop_fn: func
5457 """
5558
5659 values = values .copy () if values else {}
@@ -80,7 +83,11 @@ def get_all_iter(self, method, max_count, values=None, key='items',
8083 if limit and items_count >= limit :
8184 break
8285
83- def get_all (self , method , max_count , values = None , key = 'items' , limit = None ):
86+ if stop_fn and stop_fn (items ):
87+ break
88+
89+ def get_all (self , method , max_count , values = None , key = 'items' , limit = None ,
90+ stop_fn = None ):
8491 """ Использовать только если нужно загрузить все объекты в память.
8592
8693 Eсли вы можете обрабатывать объекты по частям, то лучше
@@ -90,12 +97,13 @@ def get_all(self, method, max_count, values=None, key='items', limit=None):
9097 все данные в память
9198 """
9299
93- items = list (self .get_all_iter (method , max_count , values , key , limit ))
100+ items = list (self .get_all_iter (method , max_count , values , key , limit ,
101+ stop_fn ))
94102
95103 return {'count' : len (items ), key : items }
96104
97105 def get_all_slow_iter (self , method , max_count , values = None , key = 'items' ,
98- limit = None ):
106+ limit = None , stop_fn = None ):
99107 """ Получить все элементы (без использования execute)
100108 Работает в методах, где в ответе есть count и items или users
101109
@@ -115,6 +123,9 @@ def get_all_slow_iter(self, method, max_count, values=None, key='items',
115123 :param limit: ограничение на кол-во получаемых элементов,
116124 но может прийти больше
117125 :type limit: int
126+
127+ :param stop_fn: функция, отвечающая за выход из цикла
128+ :type stop_fn: func
118129 """
119130
120131 values = values .copy () if values else {}
@@ -138,8 +149,11 @@ def get_all_slow_iter(self, method, max_count, values=None, key='items',
138149 if limit and items_count >= limit :
139150 break
140151
152+ if stop_fn and stop_fn (items ):
153+ break
154+
141155 def get_all_slow (self , method , max_count , values = None , key = 'items' ,
142- limit = None ):
156+ limit = None , stop_fn = None ):
143157 """ Использовать только если нужно загрузить все объекты в память.
144158
145159 Eсли вы можете обрабатывать объекты по частям, то лучше
@@ -150,7 +164,8 @@ def get_all_slow(self, method, max_count, values=None, key='items',
150164 """
151165
152166 items = list (
153- self .get_all_slow_iter (method , max_count , values , key , limit )
167+ self .get_all_slow_iter (method , max_count , values , key , limit ,
168+ stop_fn )
154169 )
155170 return {'count' : len (items ), key : items }
156171
0 commit comments