2017-02-15 25 views
0

我有一些代码,打印出它接收在一个循环的任何消息:如何将发电机转换为仅返回发电机产生的第一个值的功能?

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() 

我想改变这个代码,它使用一个简单的函数,停止遇到一个消息,直到然后返回一个消息,当然还有控制:

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()) 

这怎么办?

+0

您可以在函数内的发生器上使用'next'来给出第一个值 – akash93

回答

1

pytg的Receiver.messagedoesn’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 
相关问题