2017-02-15 50 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