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

 Смежные вопросы

  • Нет связанных вопросов^_^