Сопрограмм в Python


Я прочитал следующий код из книги, и у меня есть несколько вопросов по этому поводу.

def coroutine(func):
    def start(*args, **kwargs):
        g = func(*args, **kwargs)
        g.next()
        return g
    return start

@coroutine
def receiver():
    print("Ready to receive")
    while True:
        n = (yield)
        print("Got %s" % n)

r = receiver()
r.send("hello, world")

При использовании coroutine начальная .next() не требуется. В моем понимании, если r = receiver(), то r = start, поэтому, когда я вызываю r.send(), это равно start.send(), тогда я снова вызываю .next(), верно? Но результат оказался совсем не таким, как я ожидал.

1 4

1 ответ:

Ваша проблема не в сопрограммы. Вы неправильно поняли функцию декоратора. После r = receiver(), r-это не начало, а g. прочитайте о украшении функции, и вы поймете, что происходит.