Как упростить сопрограммы Python?

Я действительно хотел бы использовать сопрограммы Python для упрощения своих потребителей данных, но я считаю стандартную реализацию не очень элегантной:

def printer():
    print('setup')

    try:
        while True:
            data = yield
            print(data)

    except GeneratorExit:
        pass

    print('cleanup')

Есть ли способ написать потребителя с помощью цикла for?

def printer():
    print('setup')

    for data in yield_iterator():
        print(data)

    print('cleanup')

Я пробовал несколько разных вещей для инкапсуляции yield и обработки GeneratorExit, но как только я перемещаю yield в подфункцию, printer() больше не распознается как сопрограмма.

Знаете ли вы элегантный способ написания сопрограмм на питоне?


person Dave    schedule 17.08.2020    source источник


Ответы (1)


Наконец-то я смог создать решение на основе ответа plamut: https://stackoverflow.com/a/60118660/11462250

Ключевым моментом было создание ожидаемого объекта, который выдает в await.

class Awaitable:
    def __await__(self):
        return (yield)

Тогда можно написать что-то вроде этого:

async def printer(source):
    print('setup')

    async for data in source:
        print(data)

    print('cleanup')
person Dave    schedule 18.08.2020