Skip to content

Commit 6cff073

Browse files
authored
Merge pull request #96 from xkord/devel
Added date time limit for tools.py get_all method
2 parents 15f555b + 42e9741 commit 6cff073

File tree

1 file changed

+21
-6
lines changed

1 file changed

+21
-6
lines changed

vk_api/tools.py

Lines changed: 21 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)