Как можно иметь сопрограммы в стиле PEP-342, где приостановка выполнения и переход в другой контекст выглядит как вызов Python

Программы на Python
Anonymous
Как можно иметь сопрограммы в стиле PEP-342, где приостановка выполнения и переход в другой контекст выглядит как вызов

Сообщение Anonymous »

Генератори Python позволяют потоку программы переключаться между двумя разными местами, при этом сообщения передаются между использованием .send и выход в соответствии с PEP-342. Например:

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

def coroutine(lst):
x = yield
lst.append(f"{x=}")
y = yield
lst.append(f"{y=}")
yield

def func():
lst = []
coro = coroutine(lst)
next(coro)
coro.send(1)
coro.send(2)
return lst
Здесь вызов func() вернет ['x=1', 'y=2']. Выполнение программы начинается с func, но переключается между телом func и телом сопрограммы, пока программа продолжается в соответствии с семантикой, определенной в PEP 342. Обратите внимание, что слово «Сопрограмма», используемая в этом PEP (и в моем примере здесь), означает нечто совсем иное, чем современные ожидаемые сопрограммы; эта функциональность присутствует в языке с 2005 года и не предполагает фактического параллелизма.
Мне нужна установка, которая будет иметь тот же семантический эффект, но где операция «приостанавливает выполнение и переходит в другой контекст, возможно, с сообщением» выглядит как вызов функции с обоих концов. Например:

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

@magical_coroutine_decorator
def coroutine(lst):
x = get_thing()
lst.append(f"{x=}")
y = get_thing()
lst.append(f"{y=}")

def func():
lst = []
coro = coroutine(lst)
coro.send(1)
coro.send(2)
return lst
Какая реализация Magic_coroutine_decorator и get_thing будет иметь искомую семантику? Есть ли где-нибудь библиотека, которая уже это делает?

Подробнее здесь: https://stackoverflow.com/questions/790 ... and-moving

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