Преобразование функции обратного вызова в генераторPython

Программы на Python
Anonymous
Преобразование функции обратного вызова в генератор

Сообщение Anonymous »

Предположим, я создаю библиотечную функцию, которая работает постепенно и передает результаты через функции обратного вызова:

Код: Выделить всё

def do_something(even_callback, odd_callback):
for i in range(10):
if i % 2:
even_callback(i)
else:
odd_callback(i)
Некоторые вызывающие программы обрабатывают два типа событий по-разному, поэтому используют отдельные реализации обратного вызова. Однако многие вызывающие программы не обращают внимания на разницу и просто используют одну и ту же реализацию:

Код: Выделить всё

do_something(print, print)
Для этих вызывающих объектов было бы удобнее иметь версию функции do_something_generator:

Код: Выделить всё

for result in do_something_generator():
print(result)
Оставляя в стороне решение переписать do_something, чтобы оно было самим генератором или асинхронным/потоком/процессом, как я могу обернуть do_something, чтобы превратить его в генератор ? (Также исключая «получить все результаты в списке, а затем выдать их»)

Судя по обсуждениям в комментариях, одним из возможных решений было бы переписать do_something в качестве генератора, а затем обернуть ее для получения версии обратного вызова, однако для этого потребуется пометить события как «четные» или «нечетные», чтобы их можно было отличить в реализации обратного вызова.
В моем конкретном случае это неосуществимо из-за частых событий с порциями данных — добавление тегов в базовую реализацию — это нетривиальные накладные расходы по сравнению с обратными вызовами.>

Подробнее здесь: https://stackoverflow.com/questions/738 ... -generator

Вернуться в «Python»