2017-02-15 1 views
0

je code qui imprime les messages qu'il reçoit dans une boucle:Comment un générateur peut-il être converti en une fonction qui ne renvoie que la première valeur générée par le générateur?

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

Je souhaite modifier ce code tel qu'il utilise une fonction simple qui arrête jusqu'à ce qu'un message est rencontré, puis retourne qu'un message et, bien sûr, de contrôle:

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

Comment cela pourrait-il être fait?

+0

Vous pouvez utiliser 'next' une fois sur le générateur dans la fonction pour donner la première valeur – akash93

Répondre

1

Receiver.messagedoesn’t seem to give you access to the generator’s GeneratorExit, de pytg de sorte que vous pourriez avoir à pirater:

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 

Ou plonger dans ses parties en situation irrégulière (et donc instable), bien que ce n'est pas une bonne idée de le faire:

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