如何将生成器转换为 returns 只有生成器产生的第一个值的函数?

How can a generator be converted to a function that returns only the first value yielded by the generator?

我有一些代码可以循环打印出它收到的任何消息:

import pytg
import pytg.utils
import pytg.receiver

@pytg.utils.coroutine
def receiver_function(tg_receiver):
    while True:
        message = (yield)
        print(message)

tg_receiver = pytg.receiver.Receiver()
tg_receiver.start()
tg_receiver.message(receiver_function(tg_receiver))
receiver.stop()

我想更改此代码,使其使用一个简单的函数,该函数会暂停直到遇到一条消息,然后 returns 那条消息,当然还有控制:

import pytg
import pytg.receiver

def get_one_message():
    tg_receiver.start()
    while #<insert magic>:
        #<insert magic>
        message = #<insert magic>
    tg.receiver.stop()
    return message

print(get_one_message())

这是怎么做到的?

pytg 的 Receiver.message doesn’t seem to give you access to the generator’s GeneratorExit,因此您可能需要破解它:

def get_one_message():
    message = None

    @pytg.utils.coroutine
    def receiver_function(tg_receiver):
        nonlocal message
        message = (yield)

    tg_receiver.start()
    tg_receiver.message(receiver_function(tg_receiver))
    tg_receiver.stop()
    return message

或深入研究其未记录(因此不稳定)的部分,尽管这样做不是一个好主意:

def get_one_message():
    tg_receiver.start()
    tg_receiver._new_messages.acquire()
    with tg_receiver._queue_access:
        message = tg_receiver._queue.popleft()
    tg_receiver.stop()
    return message